【问题标题】:Determining whether file supports Exif header in Java确定文件是否支持 Java 中的 Exif 标头
【发布时间】:2021-10-08 11:18:27
【问题描述】:

我正在使用 Java 和库 metadata extractor 来处理文件元数据。

我想要的是可靠地检查一个文件是否支持 Exif 标头(如果标头中尚不可用,是否也支持它)。

据我所知,JPEG 和 TIFF 以及一些 PNG(以及其他)支持 Exif 标头。

目前我只是检查 JPEG 或 TIFF 的文件类型(通过使用 FileTypeDetector::detectFileType),但是否可以在不检查文件类型的情况下可靠地确定文件是否支持 Exif 标头?然后也可以考虑其他格式的文件也支持 Exif 头。

提前致谢!

【问题讨论】:

  • 为什么尝试获取 exif 信息然后相应地处理任何异常/错误会出现问题?大概你的目标是获取信息?任何其他方式都将是(afaics)多余的,并且会给您在不断变化的规格和功能的移动目标上的代码维护问题
  • 获取信息不是问题。但我不仅想获取 Exif 信息,还想在 Exif 标头中写入一些内容/更改 Exif 信息。如果文件还没有 Exif 标头(但支持它),我想创建 Exif 标头并将信息写入其中。所以我不能只检查 Exif 标头是否已经可用,如果是则读取。
  • 对。该库是否支持编写 Exif?
  • Metadata 类有一个方法addDirectory,我可以在其中添加新目录(例如ExifIFD0Directory 的新实例),在Directory 上,您可以调用setIntsetString等等。所以我假设该库支持编写 Exif。

标签: java exif metadata-extractor


【解决方案1】:

是否可以在不检查文件类型的情况下可靠地确定文件是否支持Exif头?

没有。无法通过检查文件来“检测”文件是否支持 Exif 元数据(术语“Exif 标头”用词不当)。我认为您当前确定文件格式的方式,并保留您知道支持 Exif 的格式列表是有意义的。


请注意,支持 Exif 元数据的每种文件格式通常都将其包装在“本机”(与格式自身一样)容器结构中,因此您通常必须为要添加 Exif 元数据的每种格式添加自定义代码。唯一的例外是 TIFF,因为 Exif 元数据基于 TIFF 格式。另见Wikipedia on Exif

当然,技术上可以将 Exif 元数据附加或插入到任何文件,但这通常会导致文件损坏或 Exif 元数据将被其他软件忽略。

【讨论】:

  • 非常感谢您的有用回答!
【解决方案2】:

Exif 支持的文件格式比您想象的要多,而且大多数软件并不期望如此。它也可能不止一次出现,尽管意义不大,也不是任何读者所期望的。

  • JFIF (JPEG):在前缀为 "Exif\0\0" 的 APP1 段中
  • PNGJNGMNG:在文本块中(iTXtzTXttEXt),带有关键字exifAPP1,或在它们自己的块中(eXIf、@ 987654357@, zxIf)
  • PSD:在 ID 为 0x04220x0423 的资源中
  • TIFF 和许多从中借用的格式(CR2ORFDNGRAWJXRNIFFMDI):在标签中0x8769(和@98763@4用于 GPS,0xA005 用于互操作性)
  • 使用QTFF的格式(即JP2JXSJXLHEIFQTIF图片或MOV/QT/3GP/MP4/AVC/MJ2容器):在原子中exifexfc,原子uuid,其UUID 为"\x05\x37\xcd\xab\x9d\x0c\x44\x31\xa7\x2a\xfa\x56\x1f\x2a\x11\x3e" 或字面上类似于16 字节"JpgTiffExif->JP2"
  • 使用RIFF 的格式(即WebP 图片或AVI 容器或WAVSBKSB2AIFF/AIFC8SVX 音频):使用exif 列表几个自己的块,或者一个EXIF

此列表可能不完整。而您只要求 Exif - 支持 XMP 本身就是一个主题。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2010-10-03
    • 2017-07-20
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2012-01-07
    • 2018-10-19
    相关资源
    最近更新 更多