- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在研究将标签写入图像的方法,类似于 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/
本文整理了Java中org.apache.sanselan.common.ZLibUtils类的一些代码示例,展示了ZLibUtils类的具体用法。这些代码示例主要来源于Github/Stackove
这两个库 Sanselan 和 Java Advanced Imaging API 哪个更好? 最佳答案 Sanselan 具有一些 JAI 没有的功能,例如支持读取和写入 EXIF 数据。 但是,如
我一直在研究将标签写入图像的方法,类似于 Windows Live 照片库的工作方式。我玩过几个不同的库(元数据提取器、jhead、jheader、sanselan),但真正发现 Sanselan 可
本文整理了Java中org.apache.sanselan.common.ZLibUtils.()方法的一些代码示例,展示了ZLibUtils.()的具体用法。这些代码示例主要来源于Github/St
本文整理了Java中org.apache.sanselan.common.ZLibUtils.getStreamBytes()方法的一些代码示例,展示了ZLibUtils.getStreamBytes
本文整理了Java中org.apache.sanselan.common.ZLibUtils.deflate()方法的一些代码示例,展示了ZLibUtils.deflate()的具体用法。这些代码示例
我想使用 awt 和 Apache Commons Imaging(以前称为 Apache Commons Sanselan)读取图像并对其进行缩放我无法缩放图像,但我可以在浏览器中将其正确地视为 j
尝试使用 Apache-Commons Sanselan 加载通过 PackBits 压缩进行压缩的 TIFF 时,出现开箱即用的 ArrayIndexOutOfBoundsException。 代码
我将使用 java 修改 Tiff 标签并将其添加到现有的 tif 文件中。 JAI imageio 崩溃了,因为它无法处理来自 Tiff 6.0 的某些标签。 Apache Commons-Imag
我是一名优秀的程序员,十分优秀!