JPEG系列二 JPEG文件中的EXIF(上)
生活随笔
收集整理的這篇文章主要介紹了
JPEG系列二 JPEG文件中的EXIF(上)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JPEG圖片中的EXIF信息遵循TIFF格式標準,因此EXIF分為上下兩篇。
上篇介紹一下TIFF文件格式,下篇介紹EXIF在JPEG中的作用和存儲的信息。
TIFF文件格式簡介
TIFF - Tag Image File Format文件格式最早是為了存儲掃描儀圖像而設計的。它的最大的特點就是與計算機的結構、操作系統以及圖形硬件系統無關。它可處理黑白、灰度、彩色圖像。在存儲真彩色圖像時和BMP格式一樣,直接存儲RGB三原色的濃度值而不使用彩色映射(調色板)。對于介質之間的交換,TIF稱得上是位圖格式的最佳選擇之一。 TIFF的全面性也產生了不少問題,它的包羅萬象造成結構較為復雜,變體很多,兼容性較差,它需要大量的編程工作來全面譯碼。例如,TIF圖像數據可以用幾種不同的方法壓縮,用一個程序來讀出所有的TIF幾乎是不可能的。
TIFF文件格式結構 TIFF圖一般由三個部分組成:文件頭(簡稱IFH)、文件目錄(簡稱IFD)、圖像數據。TIF圖像文件的一般組織形式是:IFH——圖像數據——IFD。 IFD數據結構并不一定緊跟在IFH后面,相反,它常常位于圖像數據的后面。
1、圖像文件頭(Image?File?Header簡稱IFH)
?
???????????IFH結構描述(圖1)
IFH數據結構包含3個成員共計8個字節:
| 名稱 | 字節數 | 數據類型 | 說明 |
| Byte order | 2 | Integer | TIF標記,其值為“MM”(0x4d4d)或“II”(0x4949) 0x4d4d表示該TIFF圖是Motoral整數格式,即BigEndian; 0x4949表示該圖是Intel整數格式,即LittleEndian。 |
| Version | 2 | Integer | 版本號,其值恒為0x2A 00 |
| Offset to first IFD | 4 | Long | 第一個IFD相對文件開始處的偏移量(可能會有多個順序排列的IFD) |
2、圖像文件目錄(Image?File?Directory簡稱IFD)
?????????IFD及DE結構描述(圖2)
IFD結構 IFD是TIFF圖像文件中重要的數據結構,它包含了三個成員:DE count、DE、next IFD offset。 由于一個TIFF文件中可以有多個圖像,而一個IFD只標識一個圖像的所有屬性(或稱之為“標簽”),所以,一個TIFF文件中有幾個圖像,就會有幾個IFD。
IFD的結構:
| 名稱 | 字節數 | 數據類型 | 說明 |
| Directory?Entry?Count | 2 | Integer | 該IFD中DE的數量 |
| Directory?Entry(1) | 12 | Integer | DE,“目錄項” |
| Directory?Entry(2)? | 12 | Integer | DE的個數是不定的,因為每個DE只標識了圖像的一個屬性,那么這幅圖像有N個屬性就會有N個DE; |
| …… | ? | ? | 用戶甚至可添加自定義的標記屬性,這就是為什么稱TIF格式文件為“可擴充標記的文件”的原因。 |
| Directory?Entry(N) | 12 | Integer | ? |
| Offset?to?next?IFD? | 4 | Long | 下一個IFD相對于文件開始處的位置,這是一個鏈式結構。 如果該數字為0,表示已經是最后一個IFD。 如果該TIF文件只包含了一幅圖像,那么就只有一個IFD,這個偏移量也會等于0。 |
DE目錄入口(Directory?Entry) 一個DE就是一幅圖像的某一個屬性。例如圖像的大小、分辨率、是否壓縮、像素的行列數、顏色深度(單色、16色、256色、真彩色)等等。
DE結構:
| 名稱 | 字節數 | 數據類型 | 說明 |
| tag | 2 | Integer | 本屬性的標簽編號。在圖像文件目錄中,它是按照升序排列的(但不一定是連續的) |
| type | 2 | Integer | 本屬性值的數據類型 |
| length | 4 | Long | 該類型數據的個數 |
| valueOffset | 4 | Long | 屬性值的存放偏移量。 tagID代表的變量值相對文件開始處的偏移量,但如果變量值占用的空間不多于4個字節(例如只有1個Integer類型的值),那么該值就直接存放在valueOffset中,沒必要再另外指向一個地方了。 |
DE中標簽編號的含義
| TagID | 屬性名稱 | type | 說明 |
| 0100 | 圖像寬 | Integer | ? |
| 0101 | 圖像高 | Integer | ? |
| 0102 | 顏色深度 | Integer | 1為單色,4為16色,8為256色。 如果該類型數據個數>2個,說明是真彩圖像 |
| 0103 | 圖像數據是否壓縮 | Integer | 壓縮方式(1/2/5/6/32773),1為不壓縮,其他表示壓縮 |
| 0106 | 圖像是否采用反色顯示 | Integer | 01表示反色,否則表示不反色 對于RGB圖,該值是2 |
| 0111 | 圖像掃描線偏移量 | Long | 圖像數據起始字節相對于文件開始處的位置 |
| 0116 | 圖像掃描線的數量 | Long | 表示圖像有幾行掃描線,實際上等于圖像高度 |
| 0117 | 圖像數據字節總數 | Integer | 一般是個偶數。如果是奇數,那么實際存放時會在后面補一個0,但這個0不會計算在字節總數之內。 |
| 011A | 水平分辯率偏移量 | RATIONAL | 單位:像素/英寸 分數型的屬性,其值要占用8個字節,所以在valueOffset中存放的肯定是它的具體數值的偏移量,而不是數值本身。下同。 |
| 011B | 垂直分辯率偏移量 | RATIONAL | 單位:像素/英寸 |
| 011C | 像素存儲順序 | Integer | 每個像素的(R,G,B)是如何存儲的。1表示按照RGBRGB的順序來存儲 |
| 0128 | X/Y分辨率單位 | Integer | X/Y軸分辨率的單位 |
| 0131 | 生成該圖像的軟件名 | ASCII | 字符型屬性。值所占用的空間也會大于4字節,所以在valueOffset中存放的也是它們的值的偏移量,而不是值本身。下同。 |
| 0132? | 生成該圖像的時間 | ASCII | ? |
| 0140 | 調色板偏移量 | Integer | 256色和16色圖像才有此屬性,而且有連續2個調色板,但屬性的length值只表示出1個調色板 |
在TIFF6.0中,定義了12種數據類型,分別是:
|
3、TIFF中的圖像數據 圖像數據。這些數據可能是壓縮的,也可能是未壓縮的。如果經過壓縮,那么壓縮算法又有許多種,所以,圖像數據是TIF文件中最為復雜的部分,暫還沒有哪個軟件能譯出所有的壓縮算法。
TIFF實例 用畫圖程序新建一個17*15的白色圖像,另存為TIF文件:
0000:?49?49?2A?00?4E?00?00?00?80?3F?E0?50?38?24?16?0D
0010:?07?84?42?61?50?B8?64?36?1D?0F?88?44?62?51?38?A4
0020:?56?2D?17?8C?46?63?51?B8?E4?76?3D?1F?90?48?64?52
0030:?39?24?96?4D?18?80?80?00?60?00?00?00?01?00?00?00
0040:?60?00?00?00?01?00?00?00?08?00?08?00?08?00??0F?00
0050:?FE?00?04?00?01?00?00?00?00?00?00?00?00?01?03?00
0060:?01?00?00?00?11?00?00?00?01?01?03?00?01?00?00?00
0070:?0F?00?00?00?02?01?03?00?03?00?00?00?48?00?00?00
0080:?03?01?03?00?01?00?00?00?05?00?00?00?06?01?03?00
0090:?01?00?00?00?02?00?00?00?11?01?04?00?01?00?00?00
00A0:?08?00?00?00?15?01?03?00?01?00?00?00?03?00?00?00
00B0:?16?01?04?00?01?00?00?00?0F?00?00?00?17?01?04?00
00C0:?01?00?00?00?2F?00?00?00?1A?01?05?00?01?00?00?00
00D0:?38?00?00?00?1B?01?05?00?01?00?00?00?40?00?00?00
00E0:?1C?01?03?00?01?00?00?00?01?00?00?00?28?01?03?00
00F0:?01?00?00?00?02?00?00?00?3D?01?03?00?01?00?00?00
0100:?01?00?00?00?00?00?00?00
簡要分析(注意轉換16進制數據時,低位在前,高位在后):
0000-0007:49?49?2A?00?4E?00?00?00 文件頭,0x49 49表示該圖是Intel整數格式;0x2A 00表示TIFF版本號;0x4E表示第一個IFD的偏移量為4E。
004E-0107:第一個IFD。 Directory?Entry?Count的值0x0F為15,表示這個IFD中有15個DE。
每個DE占用12字節,15個DE共占用180字節,加上Directory?Entry?Count占用的2字節,再加上Offset?to?next?IFD占用的4字節,這個IFD共占用186字節,換算為16進制就是BA,所以,它的數據結束于0x4E + 0xBA = 0107。
Offset?to?next?IFD的值(最后4個字節)均為0,表示整幅圖像文件只有這一個IFD。
其中15個DE的描述:
| 序號 | 偏移量 | TagID | Type | length | Value/Offset | 說明 |
| 1 | 0050 | 00FE | Long | 1 | 00 | 未知屬性值=0 |
| 2 | 005C | 0100 | Integer | 1 | 11 | 圖像寬為17像素(10進制) |
| 3 | 0068 | 0101 | Integer | 1 | 0F | 圖像高為15像素(10進制) |
| 4 | 0074 | 0102 | Integer | 3 | 48 | 3個Integer類型的值,共計6字節 所以Value/Offset中存放的是其值的偏移量。 其值存放在48-4D |
| 5 | 0080 | 0103 | Integer | 1 | 05 | 圖像是壓縮數據,壓縮類型為5 |
| 6 | 008C | 0106 | Integer | 1 | 02 | 圖像不反色顯示 |
| 7 | 0098 | 0111 | Long | 1 | 08 | 圖像數據起始字節為8 |
| 8 | 00A4 | 0115 | Integer | 1 | 03 | 未知屬性值=3 |
| 9 | 00B0 | 0116 | Long | 1 | 0F | 圖像掃描線有15行 |
| 10 | 00BC | 0117 | Long | 1 | 2F | 圖像共有47個字節的壓縮數據 |
| 11 | 00C8 | 011A | RATIONAL | 1 | 38 | 水平分辯率存放在38-3F |
| 12 | 00D4 | 011B | RATIONAL | 1 | 40 | 垂直分辯率存放在40-47 |
| 13 | 00E0 | 011C | Integer | 1 | 01 | 像素存儲順序,?1為RGB |
| 14 | 00EC | 0128 | Integer | 1 | 02 | Xresolution和Yresolution的單位,值為2 |
| 15 | 00F8 | 013D | Integer | 1 | 01 | 未知屬性值=1 |
0008-0037:圖像數據。 注意最后那個0是補加的,它沒有統計在“圖像數據字節總數”屬性值中。
0038-003F:60?00?00?00?01?00?00?00 水平分辯率值,8個字節。
由于它是分數類型,前4個字節是分子,其值為0x60 00 00 00,轉換為10進制就是96,后4個字節是分母,其值是0x01 00 00 00,轉換為10進制就是1。所以,分數值是96/1,它表示每英寸96像素
0040-0047:60?00?00?00?01?00?00?00 垂直分辯率值。同樣為96像素。
0048-004D:08?00?08?00?08?00 顏色深度值。3個整型數據值都為8,表示這是一幅24位圖像。
TIFF格式參考 http://www.pediy.com/kssd/pediy12/109316.html http://bbs.pfan.cn/post/309477.html?
總結
以上是生活随笔為你收集整理的JPEG系列二 JPEG文件中的EXIF(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福彩3D数据整理
- 下一篇: Stringtie详解