我一直在研究将标签写入图像的方法,类似于 Windows Live 照片库的工作方式。我玩过几个不同的库(元数据提取器、jhead、jheader、sanselan),但只是真正找到了 Sanselan 来适应写回我需要的数据。
我跟着 Apache 的WriteExifMetadataExample到了一个 T & 它完美地更新了 GPS 数据和 Aperture。
然后我尝试修改示例以更新EXIF_TAG_XPKEYWORDS
而不是EXIF_TAG_APERTURE_VALUE
.
在上面链接的示例中,我用TiffOutputField.create
以下内容替换了该行:
String currentTagsAsString = new String((byte[]) jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_XPKEYWORDS).getValue());
System.out.println("current tags: '" + currentTagsAsString + "'");
String newTag = "h e l l o";
String newTagsAsString = currentTagsAsString.trim() + " ; " + newTag + " ";
System.out.println("new desired tags: '" + newTagsAsString + "'");
TiffOutputField keywords = new TiffOutputField(ExifTagConstants.EXIF_TAG_XPKEYWORDS, FieldType.FIELD_TYPE_BYTE, newTagsAsString.length(), newTagsAsString.getBytes());
exifDirectory.removeField(ExifTagConstants.EXIF_TAG_XPKEYWORDS);
exifDirectory.add(keywords);
除了注释掉光圈和 GPS 更新代码之外,其余的我都不管了。我承认字节数组的格式让我有点困惑,所以这很可能是问题所在。
我没有收到警告/错误/等。该过程正常完成,但新的图像文件不包含更新的标签。为什么新图像不包含更新的标签?有没有更简单/更好的方法?
更新:我已经编辑了代码以使用 1.0 RC commons-imaging API,但是结果是一样的。为了完整起见,我在这里包含了我使用的代码
TiffImageMetadata metadata = toTiffMetadata(Imaging.getMetadata(inputFile));
System.out.println(metadata.getFieldValue(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS));
TiffOutputSet outputSet = metadata.getOutputSet();
TiffOutputDirectory exif = outputSet.getOrCreateExifDirectory();
exif.removeField(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS);
exif.add(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;");
writeFileWithNewTag(inputFile,destinationFile,outputSet);
如果我使用类似的东西,新代码效果很好EXIF_TAG_XPAUTHOR
,但使用EXIF_TAG_XPKEYWORDS
不会产生任何错误或警告或消息,并且新文件根本不包含新标签数据