java - 用 Sanselan 编写 EXIF XPKEYWORDS

标签 java exif

我一直在研究将标签写入图像的方法,类似于 Windows Live 照片库的工作方式。我玩过几个不同的库(元数据提取器、jhead、jheader、sanselan),但真正发现 Sanselan 可以适应我需要的数据写回。

我关注了 Apache 的 WriteExifMetadataExample到 T & 它可以完美地更新 GPS 数据和光圈。

然后我尝试修改示例以更新 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 不会产生任何错误或警告或消息,而且新文件只是不包含新标签数据

最佳答案

我使用这段代码成功添加了 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();
        }
    }
}

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

关于java - 用 Sanselan 编写 EXIF XPKEYWORDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593707/

相关文章:

python - 使用python,如何读取文件的 "date created"?

java - 我应该对不可变类的突变尝试抛出异常吗?如果是这样,哪个异常(exception)?

java - 在 Spring MVC 中使用 URL 的一部分作为 Controller 的参数

go - 使用 Go 读取 Exif 元数据

shell - Exiftool:将文本文件中的元数据批量写入 JPEG

Android 图像调整大小和保留 EXIF 数据(方向、旋转等)

javascript - 如何在 Javascript 中从图像文件数据读取地理位置

java - 替换 100 数组中的整数

Java Swing : unable to load image using getResource

java - Hibernate - 子级错误不会回滚父级插入数据库