1. 程式人生 > WINDOWS開發 >JPEG/Exif/TIFF格式解讀(4):win10照片旋轉win7不識別

JPEG/Exif/TIFF格式解讀(4):win10照片旋轉win7不識別

xif元資料根據不同的內容分佈在五個不同的IFD中。

  1. IFD0中的資料是由TIFF定義的基本影象資料,其中有些與照片無關,所以Exif只實現其中一小部分。這部份資料在Photoshop中稱為TIFF元資料。

  2. Exif subIFD中的資料是由Exif定義的元資料,都是和相機照片有關的資料,是Exif的主要資料,其中有一些與IFD0中的重複。

  3. GPS subIFD 中的資料是記錄照片的拍攝位置,對於沒有GPS功能的相機,這裡的資料都是空的。

  4. IFD1中的資料是縮圖的影象及該影象的元資料。

  5. 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中的寬度與高度資訊。

  1. 向右旋轉90度,標誌位為06

  2. 再向右旋轉90度,即旋轉了180度,標誌位為03

  3. 再向右旋轉90度,即旋轉了270度,標誌位為08

  4. 再向右旋轉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