使用 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 中:
ImageDescription
(0x010E
)
Artist
(0x013B
)
Copyright
(0x8298
)
我使用 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 标签:
DateTimeOriginal
(0x9003
)
SubSecTimeOriginal
(0x9291
)
TimeZoneOffset
(0x882a
)
但是这些 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);
我有一个 JPEG 文件,我已从中删除了 所有 元数据。使用 Java 和 Apache Commons Imaging 我想从头开始将自定义元数据添加到 JPEG。使用 ExifRewriter().updateExifMetadataLossy(…)
我已经设法更新了以下 Exif 标签,因为它们在 IFD0 中:
ImageDescription
(0x010E
)Artist
(0x013B
)Copyright
(0x8298
)
我使用 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 标签:
DateTimeOriginal
(0x9003
)SubSecTimeOriginal
(0x9291
)TimeZoneOffset
(0x882a
)
但是这些 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);