Java API用于ExifTool

7

我希望能够使用Java API或类似的方式解析ExifTool的结果。

我一直在研究,但是没有找到任何示例。例如,我该如何在我的Java项目中获取这些结果呢?

ExifTool版本号:8.22

文件名:ExifTool.jpg

目录:t/images 文件

大小:24 kB 文件修改日期/时间

等等..我正在寻找一个 "如何" 或类似的东西。

3个回答

7

ExifTool (for Java)旨在成为一个易于使用和强大的Java抽象,基于Phil Harvey的ExifTool。在imgscalr项目的保护下,我在上周发布了第一个公开版本。

该项目采用商业友好的Apache 2许可证。

我的目标不仅是将外部进程执行代码从调用者中抽象出来(就像大多数其他抽象层似乎正在做的那样),而是实际上设计一个包装器,使其与集成紧密且具有弹性(稍后我会澄清我的意思),使您可以像Java本身编写ExifTool类一样处理它们的实例。

在这个初始版本中,我支持读取标签数据(将在未来版本中添加写入功能),并且非常简单:

File image = // path to some image
ExifTool tool = new ExifTool();

Map<Tag, String> valueMap =
    tool.getImageMeta(image, Tag.GPS_LATITUDE, Tag.GPS_LONGITUDE);

System.out.println("Lat: " + valueMap.get(Tag.GPS_LATITUDE) +
    "\tLong: " + valueMap.get(Tag.GPS_LONGITUDE));

使用ExifTool的新“守护进程模式”(-stay_open True cmd line)也得到支持,启用支持只需像这样创建您的ExifTool实例即可:
ExifTool tool = new ExifTool(Feature.STAY_OPEN);

如何使用ExifTool类的文档非常详尽,涵盖了从设计到性能再到线程安全的所有内容。

除了使Java中使用ExifTool变得简单外,该类还采用了大量预防措施,以最小化运行时问题,并以良好记录的方式正确捕获和报告可能出现的任何错误(而不是让意外异常从核心Java类中冒出)。

我对这个异常处理和错误恢复非常严谨,因为该类旨在允许您在忙碌的Web应用程序等高可用性环境中利用ExifTool。我不仅想包装简单的Process对象,然后如果出现问题就放弃。我知道我自己(以及使用该类的任何其他人)都需要一个精心设计的API,以便轻松进行错误恢复。

例如,尝试在守护进程模式下使用ExifTool将导致该类实际检查ExifTool的底层安装是否支持该功能,并抛出UnsupportedFeatureException,如果不支持,则提供解决该问题的建议。

除了预先条件检查外,为了确保类的使用(即在守护进程模式下)不会泄漏本机操作系统进程以及用于与它们通信的Input/OutputStreams,该类提供了一个自动清理线程,该线程在指定的不活动间隔(默认为10分钟)后将清除外部进程和读/写流,使得ExifTool的空闲实例轻便且易于保留以供重复使用。
所有资源都会在下一次调用类来解析更多元数据时重新初始化,因此无需丢弃并创建新实例。此外,清理线程仅在长时间不活动后执行,而不是按照设定的时间表执行。您可以将间隔设置为任何您想要的值,或完全关闭清理线程并管理清理(只需调用close())。
这些设计都是我最终目标的一部分,即使ExifTool集成到Java应用程序中也是无缝、高效和简单的。
你可以查看主项目页面了解更多有关该项目的信息、使用方法、源代码、下载链接等,或者如果你愿意,你也可以直接跳转到GitHub并查看代码。

@chinna_82 这取决于源图像 - 如果您查看 ExifTool for Java 的源代码,TITLE 被定义为查找“XPTitle”标签数据,而 KEYWORDS(注意 'S')则是查找“XPKeywords”标签 - 您需要确保源图像中有该数据才能使其正常工作。如果您需要查找其他标签,则可以分叉代码,定义新的 ENUM 类型并使用该类。如果它对您有用,请将拉取请求提交回项目,我将审核并接受它。 - Riyad Kalla
它能支持除图像文件外的其他文件吗?比如AI文件或PSD文件。 - chinna_82
ExifTool for Java封装了本地的'exiftool'并对源文件执行一组标签 - 如果Phil的exiftool支持该文件,则ExifTool for Java也支持它。(总之:“是”) - Riyad Kalla
该工具的当前活跃维护版本位于 https://github.com/mjeanroy/exiftool。 - Mr. Lee
@RiyadKalla非常感谢您的努力,当我查看源代码时,似乎代码(甚至是像im4Java这样的库的代码)强烈依赖于主机上存在ExifTool。我的意思是,如果在运行代码的平台上不存在ExifTool,则此代码无法导出元数据标签,使其具有平台依赖性。是否有其他方法来读取元数据标签?注意:我使用apache Commons imaging库删除元数据标签,但是即使在删除后,我仍然可以通过ExifTool查看标签。 - kAmol
@kAmol 图像元数据非常复杂,甚至在不同版本和供应商之间也存在差异 - 没有比ExifTool更好的经过实战检验的工具了 - 尝试重新创建一个类似于Java本地的强大实现需要多年时间。这就是为什么我的库可以帮助轻松地将ExifTool的使用直接引入Java应用程序 - 它太好用了,不能忽视。 - Riyad Kalla

3

0

我不熟悉exiftool,但之前我曾在Java中使用MediaUtil读写exif标签(我用它来自动旋转JPEG图像)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接