我使用Java和库元数据提取器来处理文件元数据。
我想要的是可靠地检查一个文件是否支持Exif头(如果它在头中还不可用,它是否会被支持)。
据我所知,JPEG和TIFF支持Exif头,也支持一些png(以及其他)。
目前我只是检查文件类型为JPEG或TIFF(通过使用FileTypeDetector::detectFileType
),但是否有可能可靠地确定文件是否支持Exif头不检查文件类型?然后,也可以考虑其他格式的文件,这些文件也支持Exif头。
提前感谢!
是否可以可靠地确定文件是否支持Exif头而不检查文件类型?
。没有办法"检测"。文件是否支持Exif元数据(术语"Exif头");是用词不当)通过检查文件。我认为你目前确定文件格式的方式,并保留一个你知道支持Exif的格式列表是有意义的。
请注意,支持Exif元数据的每种文件格式通常将其包装在"native"(就像在格式自己的容器结构中一样),因此通常必须为要添加Exif元数据的每种格式添加自定义代码。唯一的例外是TIFF,因为Exif元数据是基于TIFF格式的。参见维基百科上的Exif。
当然,技术上可以向任何文件追加或插入Exif元数据,但是,这通常会导致文件损坏,或者Exif元数据将被其他软件忽略。
Exif支持的文件格式比您想象的要多,而且大多数软件都没有预料到这一点。它也可能出现不止一次,尽管没有什么意义,也不是任何读者所期望的。
- JFIF (JPEG):在APP1段中,前缀
"Exif "
- PNG, JNG, MNG:在文本块(
iTXt
,zTXt
,tEXt
)与关键字exif
或APP1
,或在自己的块(eXIf
,zXIf
,zxIf
) - 资源ID为
0x0422
或0x0423
的PSD: - TIFF和许多格式借用(CR2, ORF, DNG, RAW, JXR, NIFF, MDI):在标签
0x8769
(和0x8825
的GPS和0xA005
的互操作性) - 格式使用QTFF(即JP2, JXS, JXL, HEIF, QTIF图片或MOV/QT/3GP/MP4/AVC/MJ2容器):在原子
exif
或exfc
中,或通过原子uuid
, UUID为"x05x37xcdxabx9dx0cx44x31xa7x2axfax56x1fx2ax11x3e"
或字面上类似于16字节的"JpgTiffExif->JP2"
- 格式使用RIFF(即WebP图片或AVI容器或WAV, SBK, SB2, AIFF/AIFC, 8SVX音频):要么是
exif
列表与几个自己的块,或EXIF
块
此列表可能不完整。你要的是Exif支持XMP是一个独立的话题。