1 回答
TA贡献2021条经验 获得超8个赞
免责声明:我设计和编写的各种元数据读取器/写入器主要供图书馆内部使用ImageIO,并没有仔细考虑第三方使用。因此,从这个意义上说,API 可能并不“完美”。但是你想做的应该是完全可行的。:-)
虽然具体的Directory实现确实是只读的,但您可以轻松地创建自己的AbstractDirectory可变子类。或者只是使用任何Collection<? extends Entry>你喜欢的东西并将其包装在 aTIFFDirectory或IFD写作之前。我更喜欢后者,所以我先展示一下。
请注意,典型的 JPEG Exif 片段包含两个 IFD,IFD0 用于主 JPEG 图像,IFD1 用于缩略图。因此,您需要将其视为CompoundDirectory:
CompoundDirectory exif = (CompoundDirectory) new TIFFReader().read(input);
List<Directory> ifds = new ArrayList<>;
for (int i = 0; i < exif.directoryCount(); i++) {
List<Entry> entries = new ArrayList<>();
for (Entry entry : exif.getDirectory(i)) {
entries.add(entry);
}
// TODO: Do stuff with entries, remove, add, change, etc...
ifds.add(new IFD(entries));
}
// Write Exif
new TIFFWriter().write(new TIFFDirectory(ifds), output);
您还可以创建自己的 mutable Directory:
public final class MutableDirectory extends AbstractDirectory {
public MutableDirectory (final Collection<? extends Entry> entries) {
super(entries);
}
public boolean isReadOnly() {
return false;
}
// NOTE: While the above is all you need to make it *mutable*,
// TIFF/Exif does not allow entries with duplicate IDs,
// you need to handle this somehow. The below code is untested...
@Override
public boolean add(Entry entry) {
Entry existing = getEntryById(entry.getIdentifier());
if (existing != null) {
remove(existing);
}
super.add(entry);
}
}
不实现可变目录的原因正是因为处理条目的语义可能因格式而异。
添加回答
举报