xif元數(shù)據(jù)根據(jù)不同的內(nèi)容分布在五個不同的IFD中榕暇。
IFD0中的數(shù)據(jù)是由TIFF定義的基本圖像數(shù)據(jù),其中有些與照片無關(guān)喻杈,所以Exif只實現(xiàn)其中一小部分彤枢。這部份數(shù)據(jù)在Photoshop中稱為TIFF元數(shù)據(jù)。
Exif subIFD中的數(shù)據(jù)是由Exif定義的元數(shù)據(jù)筒饰,都是和相機照片有關(guān)的數(shù)據(jù)缴啡,是Exif的主要數(shù)據(jù),其中有一些與IFD0中的重復(fù)瓷们。
GPS subIFD 中的數(shù)據(jù)是記錄照片的拍攝位置业栅,對于沒有GPS功能的相機秒咐,這里的數(shù)據(jù)都是空的。
IFD1中的數(shù)據(jù)是縮略圖的圖像及該圖像的元數(shù)據(jù)碘裕。
Maskernote IFD中是制造商自己定義的元數(shù)據(jù)携取,沒有標(biāo)準(zhǔn),有些商家的數(shù)據(jù)也不對外公開帮孔。
一般談?wù)摰腅xif數(shù)據(jù)都是指Exif subIFD 和IFD0 中的數(shù)據(jù)雷滋。
Exif數(shù)據(jù)是在拍攝時由相機軟件生成並嵌入到JPG文件中,沒有規(guī)定必需生成哪些數(shù)據(jù)文兢,一般就選幾個常用的晤斩,不同廠商也有不同的選擇,這就是為什么不同相機拍的照片其Exif所包含的內(nèi)容不一樣姆坚。
Exif定義了大量的元數(shù)據(jù)澳泵,其中有一部分很少用到,還有一些比較直觀易懂兼呵,這里僅對幾個容易產(chǎn)生疑問的做些解釋兔辅。
exif信息解讀
比如某相機拍攝出來的相片,文件分辨率比如寬度7360像素击喂,高度4912像素
十進(jìn)制表示為 DEC : 7360 * 4912
十六進(jìn)制則為 HEX : 1CC0 * 1330
默認(rèn)情況下幢妄,會在00000030:07標(biāo)志位(不同設(shè)備或程序生成的圖片的標(biāo)志位會有所不同,由EXIF內(nèi)容而定)上存放01值表示原始文件的位置茫负,無論這張圖是橫著拍的還是堅著拍的,初始值為01
拍攝時相機方位乎赴,橫向還是縱向忍法。用數(shù)值表示旋轉(zhuǎn)的方向,但更多是先設(shè)定原始圖片的上邊為0行榕吼,左邊為0列饿序,用行列的位置來解讀轉(zhuǎn)動的方位,所以“上左”(0行為上羹蚣,0列為左)為原始位置原探,“右上”(0行為右,0列為上)即上邊變?yōu)橛疫呁缢兀筮呑優(yōu)樯线呇氏遥槙r針轉(zhuǎn)90度。如下表所示胁出。 x
數(shù)值0行 0 列旋轉(zhuǎn)說明
0上左原始位置
3下右180度
6右上順時針90度
8左下逆時針 90 度
那么圖片型型,在Windows 10操作系統(tǒng)下,通過操作系統(tǒng)自帶的“相片”程序進(jìn)行旋轉(zhuǎn)時全蝶,僅僅對此標(biāo)志位進(jìn)行改變闹蒜,而圖片的內(nèi)容不會做任何改變寺枉,包括旋轉(zhuǎn)后的寬度與高度也不會做改變,包括JPEG和EXIF中的寬度與高度信息绷落。
向右旋轉(zhuǎn)90度姥闪,標(biāo)志位為06
再向右旋轉(zhuǎn)90度,即旋轉(zhuǎn)了180度砌烁,標(biāo)志位為03
再向右旋轉(zhuǎn)90度筐喳,即旋轉(zhuǎn)了270度,標(biāo)志位為08
再向右旋轉(zhuǎn)90度往弓,即旋轉(zhuǎn)了360度疏唾,回到原圖,標(biāo)志位還原為01
然而函似,在Windows 10進(jìn)行旋轉(zhuǎn)的圖片槐脏,如果在Windows XP或Windows 7上面通過“相片”進(jìn)行查看仍然顯示為未旋轉(zhuǎn)前的圖片,因為不識別這個標(biāo)志位撇寞。
資源管理器在顯示分辨率那一欄中也自然是無法識別顿天,低版本的程序無法識別高版本的標(biāo)志位導(dǎo)致的問題。
于是蔑担,在處理旋轉(zhuǎn)過后的圖片牌废,通過JDK 8.0版本去讀取javax.imageio.ImageIO.read(new File(fileName)).getWidth/getHeight寬度和高度時,也是無法獲知到底是不是旋轉(zhuǎn)過的啤握。
包括其他比如HypeSnap 5.6.0版本的一些舊程序鸟缕,在打開時都會由于不支持這種方式而導(dǎo)致仍是未旋轉(zhuǎn)的問題。
試過JDK 8.0/9.0/10.0均無法識別排抬,目前最新版本的OpenJDK 13.0版本也沒能識別出來旋轉(zhuǎn)后的分辨率懂从。
但是,如果是在Windows XP或Windows 7當(dāng)中蹲蒲,對圖片文件進(jìn)行旋轉(zhuǎn)時番甩,文件的內(nèi)容做了全面的變化。旋轉(zhuǎn)后的寬度與高度也會改變并保存到EXIF中届搁,圖片內(nèi)容的改變缘薛。這樣旋轉(zhuǎn)后的文件在其他操作系統(tǒng)上進(jìn)行打開時都是正確的旋轉(zhuǎn)后的結(jié)果。
Windows 下用縮略圖視圖查看圖像會按照【第一步讀取當(dāng)前文件夾下Thumbs.db – 如果沒有Thumbs.db文件則讀取圖像exif縮略圖信息 – 如果圖像文件沒有exif縮略圖信息則生成縮略圖信息并保存至Thumbs.db】如此規(guī)則循環(huán)卡睦。
其他還有水平翻轉(zhuǎn)宴胧,垂直翻轉(zhuǎn)等,因照片拍攝沒有這樣的功能表锻,所以沒有列出牺汤。
需要指出的是只有能識別方向參數(shù)的圖像軟件(如Acdsee,Photoshop)才能在查看圖像時自動旋轉(zhuǎn)浩嫌,Windows下的圖片查看器沒有這種功能檐迟。
名稱 水平分辨率Tag ?0X011A
Tag ?0XA20E
所在目錄 IFD0
所在目錄 Exif SubIFD
名稱 垂直分辨率Tag 0X111B
Tag ?0XA20F
所在目錄 IFD0
所在目錄 Exif SubIFD
名稱 分辨率單位
(英寸/厘米)
Tag ?0X0128
Tag ?0XA210
所在目錄 IFD0
所在目錄 Exif SubIFD
Exif工具
Exiv2:一個基于C++补胚、跨平臺的程序,可以讀寫圖片元數(shù)據(jù)(EXIF, IPTC, XMP)追迟。它提供了可執(zhí)行文件供命令行使用溶其,也提供了C++的API供編程。
在前端領(lǐng)域敦间,可以通過exif-js識別圖片的exif信息
https://www.npmjs.com/package/exif-js
參考資料:
圖片文件Exif信息詳細(xì)說明 blog.sina.com.cn/s/blog_651251e60102uz3d.html#AboutExif
圖像Exif信息 元數(shù)據(jù)(Metadata) http://www.reibang.com/p/a6d67df60e7e
關(guān)于圖片文件旋轉(zhuǎn)JPEG與EXIF信息https://blog.csdn.net/yulimin/article/details/102827865
https://www.media.mit.edu/pia/Research/deepview/exif.html
https://baike.baidu.com/item/Exif/422825?fr=aladdin
讀取JPG圖片的Exif屬性(一) - Exif信息簡介https://blog.csdn.net/fioletfly/article/details/53605959
讀取JPG圖片的Exif屬性(二) - C代碼實現(xiàn) https://blog.csdn.net/fioletfly/article/details/54094940
讀取JPG圖片的Exif屬性(三) - Exif屬性讀取GPS信息代碼(C/C++實現(xiàn))https://blog.csdn.net/fioletfly/article/details/54133422
在jpg圖片添加Exif信息的C程序?qū)崿F(xiàn)https://blog.csdn.net/psy6653/article/details/79658144
JPEG添加EXIF https://blog.csdn.net/weixin_43549602/article/details/84654965
jpeg圖片格式詳解https://blog.csdn.net/yun_hen/article/details/78135122
壓縮算法——JPEG2000 編解碼原理https://blog.csdn.net/ytang_/article/details/76571635
PNG瓶逃、JPEG、BMP等幾種圖片格式詳解 http://www.reibang.com/p/f5557c0e689e
使用HTTP2和漸進(jìn)式JPEG圖片更快的加載圖像 http
轉(zhuǎn)載本站文章《JPEG/Exif/TIFF格式解讀(4):win10照片旋轉(zhuǎn)win7不識別廓块。》,
請注明出處:https://www.zhoulujun.cn/html/theory/multimedia/CG-CV-IP/8399.html