我一直在研究如何为我的图像编写标签,类似于Windows Live Photo Gallery的工作方式。我玩了几个不同的库(metadata-extractor,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);
除了评论aperature和GPS更新代码,剩下的我独自留下了。我承认字节数组的格式让我有些困惑,所以很可能是问题。
我没有警告/错误/等等。该过程正常完成,但新的Image文件不包含更新的标记。为什么新图像不包含更新的标签?有更简单/更好的方法吗?
更新:我已编辑代码以使用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
不会产生任何错误或警告或消息,新文件根本不包含新内容标签数据
答案 0 :(得分:4)
我使用以下代码成功添加了XP关键字标签:
private static void rewriteXpKeywords(String fileIn, String fileOut) throws Exception {
TiffImageMetadata exif;
IImageMetadata meta = Imaging.getMetadata(new File(fileIn));
if (meta instanceof JpegImageMetadata) {
exif = ((JpegImageMetadata)meta).getExif();
} else if (meta instanceof TiffImageMetadata) {
exif = (TiffImageMetadata)meta;
} else {
return;
}
TiffOutputSet outputSet = exif.getOutputSet();
TiffOutputDirectory exifDir = outputSet.findDirectory(TiffDirectoryConstants.DIRECTORY_TYPE_EXIF);
exifDir.removeField(AllTagConstants.EXIF_TAG_XPKEYWORDS);
exifDir.add(AllTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;");
ExifRewriter rewriter = new ExifRewriter();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(fileOut));
rewriter.updateExifMetadataLossy(new File(fileIn), fos, outputSet);
} finally {
if (fos != null) {
fos.close();
}
}
}
你怎么知道它不“修改数据”?你在检查什么?
答案 1 :(得分:1)
我有同样的问题,并得到了解决方案。您可以尝试下面的代码
public static TiffOutputField getTiffOutputFieldKeyword(
TiffOutputSet outputSet, String metaDataToChange) {
TiffOutputField imageHistoryPre = outputSet
.findField(TiffConstants.EXIF_TAG_XPKEYWORDS);
if (imageHistoryPre != null) {
outputSet.removeField(TiffConstants.EXIF_TAG_XPKEYWORDS);
}
TiffOutputField tiffOutputField = new TiffOutputField(
TiffConstants.EXIF_TAG_XPKEYWORDS,
TiffFieldTypeConstants.FIELD_TYPE_BYTE,
metaDataToChange.getBytes("UTF-16").length, metaDataToChange.getBytes("UTF-16"));
return tiffOutputField;
}
答案 2 :(得分:0)
这不再是编写新标签的推荐方式。 Microsoft XP标记是一个特殊问题,因为它们声称是byte类型,但数据实际上是UTF-16LE。
而是使用新的API来处理所有这些 - 例如http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/jpeg/exif/MicrosoftTagTest.java?view=markup