3

我一直在研究将标签写入图像的方法,类似于 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不会产生任何错误或警告或消息,并且新文件根本不包含新标签数据

4

3 回答 3

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();
        }
    }
}

你怎么知道它没有“修改数据”?你用什么检查?

于 2013-04-01T07:24:57.860 回答
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;
}

在 Exif 中编写 XPKeywords

于 2014-09-03T07:53:50.877 回答
0

这不再是编写新标签的推荐方式。Microsoft XP 标签是一个特殊的问题,因为它们声称是字节类型,但数据实际上是 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

于 2013-03-31T09:00:11.213 回答