使用 Apache Commons Imaging 从头开始​​编写 JPEG Exif DateTimeOriginal 和 TimeZoneOffset

Write JPEG Exif DateTimeOriginal and TimeZoneOffset from scratch using Apache Commons Imaging

我有一个 JPEG 文件,我已从中删除了 所有 元数据。使用 Java 和 Apache Commons Imaging 我想从头开始将自定义元数据添加到 JPEG。使用 ExifRewriter().updateExifMetadataLossy(…) 我已经设法更新了以下 Exif 标签,因为它们在 IFD0 中:

我使用 getOrCreateRootDirectory() 获得 IFD0;如果我从头开始创建元数据,使用 getOrCreateExifDirectory() 似乎不起作用:

TiffOutputSet tiffOutputSet = new TiffOutputSet();
TiffOutputDirectory exifDirectory = tiffOutputSet.getOrCreateRootDirectory();
…
TagInfoAscii tagImageDescription = new TagInfoAscii("ImageDescription", 0x010E, -1, TiffDirectoryType.EXIF_DIRECTORY_IFD0);
…
exifDirectory.add(tagImageDescription, "foo bar")
…
new ExifRewriter().updateExifMetadataLossy(byteSource, outputStream, tiffOutputSet);

这是可行的,但(本部分)拼图的最后一块是添加图像创建时间戳信息。这将是这些 Exif 标签:

但是这些 Exif 标签似乎不在其他 Exif 目录中。 (从 metadata-extractor 开始,它似乎是“子 IDF”目录)。但是,如何在 Apache Commons Imaging 中获取其他 Exif SubIFD 目录,以便我可以添加这些标签? (请记住,我是从头开始编写所有这些元数据,而不是修改元数据。)

从一个单独的answer我发现我想要的是方法TiffOutputSet.getOrCreateExifDirectory()。显然 Apache Commons Imaging 使用自己的命名约定:

  • IFD0:Apache Commons Imaging 称其为“根目录”
  • SubIFD:Apache Commons Imaging 称其为“Exif 目录”

看来我可以做到:

TiffOutputSet tiffOutputSet = new TiffOutputSet();
TiffOutputDirectory exifDirectory = tiffOutputSet.getOrCreateRootDirectory();
TiffOutputDirectory subExifDirectory = tiffOutputSet.getOrCreateExifDirectory();
…
TagInfoAscii tagImageDescription = new TagInfoAscii("ImageDescription", 0x010E, -1, TiffDirectoryType.EXIF_DIRECTORY_IFD0);
…
exifDirectory.add(tagImageDescription, "foo bar")
subExifDirectory.add(EXIF_TAG_DATE_TIME_ORIGINAL, dateString); //TODO format appropriately
…
new ExifRewriter().updateExifMetadataLossy(byteSource, outputStream, tiffOutputSet);