判断文件是否支持 Java 中的 Exif header

Determining whether file supports Exif header in Java

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

我想要的是可靠地检查文件是否支持 Exif header(如果它在 header 中不可用,是否支持)。

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

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

提前致谢!

Is it possible to reliably determine whether the file supports the Exif header without checking the file type?

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


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

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

Exif 所支持的文件格式比您想象的要多,而且大多数软件都不希望如此。它也可能不止一次出现,尽管没有什么意义,也不是任何 reader.

所期望的
  • JFIF (JPEG):在前缀为 "Exif[=10=][=10=]"
  • 的 APP1 片段中
  • PNG, JNG, MNG:在带有关键字 exifAPP1 的文本块(iTXtzTXttEXt)中,或者在他们自己的区块 (eXIf, zXIf, zxIf)
  • PSD:在 ID 为 0x04220x0423
  • 的资源中
  • TIFF and many formats borrowing from that (CR2, ORF, DNG, RAW, JXR, NIFF, MDI):在标签 0x8769 中(GPS 为 0x8825,互操作性为 0xA005
  • 使用 QTFF (i.e. JP2, JXS, JXL, HEIF, QTIF pictures or MOV/QT/3GP/MP4/AVC/MJ2 容器的格式):在原子 exifexfc 中,或者通过具有 "\x05\x37\xcd\xab\x9d\x0c\x44\x31\xa7\x2a\xfa\x56\x1f\x2a\x11\x3e" 或 UUID 的原子 uuid一个字面上类似于 16 个字节 "JpgTiffExif->JP2"
  • 使用 RIFF (i.e. WebP pictures or AVI containers or WAV, SBK, SB2, AIFF/AIFC, 8SVX 音频的格式):带有几个自己的块的 exif 列表,或者 EXIF

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