0

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

  • ImageDescription( 0x010E)
  • Artist( 0x013B)
  • Copyright( 0x8298)

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

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 标签:

  • DateTimeOriginal( 0x9003)
  • SubSecTimeOriginal( 0x9291)
  • TimeZoneOffset( 0x882a)

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

4

1 回答 1

0

从一个单独的答案中,我发现我想要的是方法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);
于 2021-02-15T20:46:30.073 回答