xif元數據根據不同的內容分布在五個不同的IFD中。
-
IFD0中的數據是由TIFF定義的基本圖像數據,其中有些與照片無關,所以Exif只實現其中一小部分。這部份數據在Photoshop中稱為TIFF元數據。
-
Exif subIFD中的數據是由Exif定義的元數據,都是和相機照片有關的數據,是Exif的主要數據,其中有一些與IFD0中的重復。
-
GPS subIFD 中的數據是記錄照片的拍攝位置,對於沒有GPS功能的相機,這里的數據都是空的。
-
IFD1中的數據是縮略圖的圖像及該圖像的元數據。
-
Maskernote IFD中是制造商自己定義的元數據,沒有標准,有些商家的數據也不對外公開。
一般談論的Exif數據都是指Exif subIFD 和IFD0 中的數據。
Exif數據是在拍攝時由相機軟件生成並嵌入到JPG文件中,沒有規定必需生成哪些數據,一般就選幾個常用的,不同廠商也有不同的選擇,這就是為什么不同相機拍的照片其Exif所包含的內容不一樣。
Exif定義了大量的元數據,其中有一部分很少用到,還有一些比較直觀易懂,這里僅對幾個容易產生疑問的做些解釋。
exif信息解讀
比如某相機拍攝出來的相片,文件分辨率比如寬度7360像素,高度4912像素
-
十進制表示為 DEC : 7360 * 4912
-
十六進制則為 HEX : 1CC0 * 1330
默認情況下,會在00000030:07標志位(不同設備或程序生成的圖片的標志位會有所不同,由EXIF內容而定)上存放01值表示原始文件的位置,無論這張圖是橫着拍的還是堅着拍的,初始值為01
拍攝時相機方位,橫向還是縱向。用數值表示旋轉的方向,但更多是先設定原始圖片的上邊為0行,左邊為0列,用行列的位置來解讀轉動的方位,所以“上左”(0行為上,0列為左)為原始位置,“右上”(0行為右,0列為上)即上邊變為右邊,左邊變為上邊,順時針轉90度。如下表所示。 x
數值 | 0行 0 列 | 旋轉說明 |
0 | 上左 | 原始位置 |
3 | 下右 | 180度 |
6 | 右上 | 順時針90度 |
8 | 左下 | 逆時針 90 度 |
那么圖片,在Windows 10操作系統下,通過操作系統自帶的“相片”程序進行旋轉時,僅僅對此標志位進行改變,而圖片的內容不會做任何改變,包括旋轉后的寬度與高度也不會做改變,包括JPEG和EXIF中的寬度與高度信息。
-
向右旋轉90度,標志位為06
-
再向右旋轉90度,即旋轉了180度,標志位為03
-
再向右旋轉90度,即旋轉了270度,標志位為08
-
再向右旋轉90度,即旋轉了360度,回到原圖,標志位還原為01
然而,在Windows 10進行旋轉的圖片,如果在Windows XP或Windows 7上面通過“相片”進行查看仍然顯示為未旋轉前的圖片,因為不識別這個標志位。
資源管理器在顯示分辨率那一欄中也自然是無法識別,低版本的程序無法識別高版本的標志位導致的問題。
於是,在處理旋轉過后的圖片,通過JDK 8.0版本去讀取javax.imageio.ImageIO.read(new File(fileName)).getWidth/getHeight寬度和高度時,也是無法獲知到底是不是旋轉過的。
包括其他比如HypeSnap 5.6.0版本的一些舊程序,在打開時都會由於不支持這種方式而導致仍是未旋轉的問題。
試過JDK 8.0/9.0/10.0均無法識別,目前最新版本的OpenJDK 13.0版本也沒能識別出來旋轉后的分辨率。
但是,如果是在Windows XP或Windows 7當中,對圖片文件進行旋轉時,文件的內容做了全面的變化。旋轉后的寬度與高度也會改變並保存到EXIF中,圖片內容的改變。這樣旋轉后的文件在其他操作系統上進行打開時都是正確的旋轉后的結果。
Windows 下用縮略圖視圖查看圖像會按照【第一步讀取當前文件夾下Thumbs.db – 如果沒有Thumbs.db文件則讀取圖像exif縮略圖信息 – 如果圖像文件沒有exif縮略圖信息則生成縮略圖信息並保存至Thumbs.db】如此規則循環。
其他還有水平翻轉,垂直翻轉等,因照片拍攝沒有這樣的功能,所以沒有列出。
需要指出的是只有能識別方向參數的圖像軟件(如Acdsee,Photoshop)才能在查看圖像時自動旋轉,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++、跨平台的程序,可以讀寫圖片元數據(EXIF, IPTC, XMP)。它提供了可執行文件供命令行使用,也提供了C++的API供編程。
在前端領域,可以通過exif-js識別圖片的exif信息
https://www.npmjs.com/package/exif-js
參考資料:
圖片文件Exif信息詳細說明 blog.sina.com.cn/s/blog_651251e60102uz3d.html#AboutExif
圖像Exif信息 元數據(Metadata) https://www.jianshu.com/p/a6d67df60e7e
關於圖片文件旋轉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代碼實現 https://blog.csdn.net/fioletfly/article/details/54094940
讀取JPG圖片的Exif屬性(三) - Exif屬性讀取GPS信息代碼(C/C++實現)https://blog.csdn.net/fioletfly/article/details/54133422
在jpg圖片添加Exif信息的C程序實現 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等幾種圖片格式詳解 https://www.jianshu.com/p/f5557c0e689e
使用HTTP2和漸進式JPEG圖片更快的加載圖像 http
轉載本站文章《JPEG/Exif/TIFF格式解讀(4):win10照片旋轉win7不識別。》,
請注明出處:https://www.zhoulujun.cn/html/theory/multimedia/CG-CV-IP/8399.html