1. 程式人生 > >TIFF影象檔案格式詳解

TIFF影象檔案格式詳解

1 什麼是TIFF?
TIFF是Tagged Image File Format的縮寫。在現在的標準中,只有TIFF存在, 其他的提法已經捨棄不用了。做為一種標記語言,TIFF與其他檔案格式最大的不同在於除了影象資料,它還可以記錄很多影象的其他資訊。它記錄影象資料的方式也比較靈活, 理論上來說, 任何其他的影象格式都能為TIFF所用, 嵌入到TIFF裡面。比如JPEG, Lossless JPEG, JPEG2000和任意資料寬度的原始無壓縮資料都可以方便的嵌入到TIFF中去。由於它的可擴充套件性, TIFF在數字影響、遙感、醫學等領域中得到了廣泛的應用。TIFF檔案的字尾是.tif或者.tiff

2 TIFF檔案結構 


TIFF檔案中的三個關鍵詞是:影象檔案頭Image File Header(IFH), 影象檔案目錄Image File Directory(IFD)和目錄項Directory Entry(DE)。每一幅影象是以8位元組的IFH開始的, 這個IFH指向了第一個IFD。IFD包含了影象的各種資訊, 同時也包含了一個指向實際影象資料的指標。
IFH的構成:
Byte 0-1: 位元組順序標誌位, 值為II或者MM。II表示小位元組在前, 又稱為little-endian。MM表示大位元組在前,又成為big-endian。
Byte 2-3: TIFF的標誌位,一般都是42
Byte 4-7: 第一個IFD的偏移量。可以在任意位置, 但必須是在一個字的邊界,也就是說必須是2的整數倍。
IFD的構成(0代表此IFD的起始位置):

Byte 0-1: 表示此IFD包含了多少個DE,假設數目為n
Byte 2-(n*12+1): n個DE
Byte (n*12+2)-(n*12+5): 下一個IFD的偏移量,如果沒有則置為0
DE的構成:
Byte 0-1: 此TAG的唯一標識
Byte 2-3: 資料型別。
Byte 4-7: 數量。通過型別和數量可以確定儲存此TAG的資料需要佔據的位元組數
Byte 8-11: 如果佔用的位元組數少於4, 則資料直接存於此。 如果超過4個,則這裡存放的是指向實際資料的指標

可以用以下的圖來表示(圖來自http://www.cppblog.com/windcsn/archive/2009/03/12/1158.html)

在TIFF6.0中,定義了12種資料型別,分別是:

1 = BYTE 8-bit unsigned integer.
2 = ASCII 8-bit byte that contains a 7-bit ASCII code; the last byte
must be NUL (binary zero).
3 = SHORT 16-bit (2-byte) unsigned integer.
4 = LONG 32-bit (4-byte) unsigned integer.
5 = RATIONAL Two LONGs: the first represents the numerator
6 = SBYTE An 8-bit signed (twos-complement) integer.
7 = UNDEFINED An 8-bit byte that may contain anything, depending on
the definition of the field.
8 = SSHORT A 16-bit (2-byte) signed (twos-complement) integer.
9 = SLONG A 32-bit (4-byte) signed (twos-complement) integer.
10 = SRATIONAL Two SLONG’s: the first represents the numerator of a
fraction, the second the denominator.
11 = FLOAT Single precision (4-byte) IEEE format.
12 = DOUBLE Double precision (8-byte) IEEE format.

-個TIFF檔案可能包含多個IFD,每一個IFD都是一個子檔案。Baseline解碼器只要求解第一個IFD所對應的影象資料。擴充套件的TIFF影象經常包含多個IFD,每一個IFD都包含了不同的資訊。

TIF圖一般由三個部分組成:檔案頭(簡稱IFH)、檔案目錄(簡稱IFD)、影象資料。
一、影象檔案頭(Image File Header)
  IFH資料結構包含3個成員共計8個位元組(見表一):
表一 IFH結構描述
------------------------------------------------------------
名稱        位元組數 資料型別 說明
------------------------------------------------------------
Byteorder       2  Integer  TIF標記,其值為4D4D或4949
Version        2  Integer  版本號,其值恆為2A00
Offset to first IFD  4  Long    第一個IFD的偏移量
------------------------------------------------------------
表一說明
  1.Byteorder:可能是H4D4D或H4949,H4D4D表示該圖是摩托羅拉整數格式,H4949表示該圖是Intel整數格式。
  2.Version:總是H2A00,它可能是tif檔案的版本,也可能用於進一步校驗該檔案是否為TIF格式。
  3.Offset to first IFD:第一個IFD相對檔案開始處的偏移量(因為可能會有多個順序排列的IFD)。
  IFD資料結構並不一定緊跟在IFH後面,相反,它常常位於第三部分影象資料的後面,即TIF影象檔案的一般組織形式是:IFH——影象資料——IFD。
  二、影象檔案目錄(Image File Directory)
  IFD是TIF影象檔案中重要的資料結構,它包含了三個成員。由於一個TIF檔案中可以有多個影象,而一個IFD只標識一個影象的所有屬性(有的文章把“屬性”稱之為“標籤”),所以,一個TIF檔案中有幾個影象,就會有幾個IFD。IFD的結構見表二:
表二 IFD結構描述
-----------------------------------------------------------------
名稱         位元組數 資料型別 說明
-----------------------------------------------------------------
Directory Entry Count  2  Integer  本IFD中DE的數量
Directory Entry(1)   12       簡稱DE,中文譯義“目錄項”
Directory Entry(2)   12
……
Directory Entry(N)   12
Offset to next IFD   4  Long    下一個IFD的偏移量
-----------------------------------------------------------------
表二說明
  1.Directory Entry Count:指出在該IFD中DE的個數;
  2.Directory Entry:共12個位元組,結構見表三。需要指出的是,DE的個數是不定的,因為每個DE只標識了影象的一個屬性,那麼這幅影象有N個屬性就會有N個DE,使用者甚至可新增自定義的標記屬性,這就是為什麼稱TIF格式檔案為“可擴充標記的檔案”的原因。
  3.Offset to next IFD Or NULL:下一個IFD相對於檔案開始處的位置,這是一個鏈式構成。如果該數字為0,表示已經是最後一個IFD。當然,如果該TIF檔案只包含了一幅影象,那麼就只有一個IFD,顯然這個偏移量也會等於0。
表三 DE結構描述
--------------------------------------------------
名稱     位元組數  資料型別 說明
--------------------------------------------------
tag       2   Integer  本屬性的標籤編號
type       2   Integer  本屬性值的資料型別
length      4   Long    該型別資料的數量
valueOffset   4   Long    屬性值的存放偏移量
--------------------------------------------------
表三說明
  由DE標識的影象屬性有:影象的大小、解析度、是否壓縮、畫素的行列數、顏色深度(單色、16色、256色、真彩色)等等。其中:
  ①tag:是該屬性的標籤編號(TagID),在影象檔案目錄中,它是按照升序排列的(但不一定是連續的)。這些編號在TIF格式官方白皮書中可以查到相應的含義,但遺憾的是,我們到哪兒可以找到官方白皮書呢?所以,筆者只能把網上能找得到資料(再結合自己的實驗結果)羅列出來,見表四。
  ②type:表示該屬性資料的型別,一般認為TIF官方指定的有5種資料型別(但也有說12種資料型別的)。見表五。
  ③length:該種類型的資料的個數,而不是某個資料的長度。
  ④valueOffset:是tagID代表的變數值相對檔案開始處的偏移量,但如果變數值佔用的空間不多於4個位元組(例如只有1個Integer型別的值),那麼該值就直接存放在valueOffset中,沒必要再另外指向一個地方了。
表四 DE中標籤編號的含義
-------------------------------------------------------------------------
TagID 屬性名稱 type 說明
-------------------------------------------------------------------------
0100 影象寬       0003
0101 影象高       0003
0102 顏色深度      0003  值=1為單色,=4為16色,=8為256色。
                 如果該型別資料個數>2個,說明是真彩圖像
0103 影象資料是否壓縮  0003  值=05表示壓縮
0106 影象是否採用反色顯示0003  值=01表示反色,否則表示不反色
0111 影象掃描線偏移量  0004  影象資料起始位元組相對於檔案開始處的位置
0116 影象掃描線的數量  0004  表示影象有幾行掃描線,實際上等於影象高度
0117 影象資料位元組總數  0003  如果不是偶數,那麼實際存放時會在後面加0
011A 水平分辯率偏移量  0005  常用計量單位是:畫素/英寸
011B 垂直分辯率 偏移量  0005  常用計量單位是:畫素/英寸
0131 生成該影象的軟體名 0002  文字型別
0132 生成該影象的時間  0002  文字型別
0140 調色盤偏移量    0003  256色和16色影象才有此屬性,而且有連續2個
                 調色盤,但屬性的length值只表示出1個調色盤
-------------------------------------------------------------------------
表四說明
  ①“水平(垂直)分辯率”是分數型的屬性,其值要佔用8個位元組,所以在valueOffset中存放的肯定是它的具體數值的偏移量,而不是數值本身。
  ②“生成影象的軟體名稱”和“生成影象的時間”這兩個字元型屬性,它們的值所佔用的空間也會大於4位元組,所以在valueOffset中存放的也是它們的值的偏移量,而不是值本身。
  ③“影象資料位元組總數”一般是個偶數,如果是奇數,那麼實際存放時會在後面加一個0,但這個0不會計算在位元組總數之內。
表五 DE中的資料型別
--------------------------------------------------------------------
type值 資料型別  說明
--------------------------------------------------------------------
0001  Byte
0002  Ascii   文字型別,7位Ascii碼加1位二進位制0
0003  Integer
0004  Long
0005  RATIONAL  分數型別,由兩個Long組成,第1個是分子,第2個是分母
--------------------------------------------------------------------
  三、影象資料。這些資料可能是壓縮的,也可能是未壓縮的。如果經過壓縮,那麼壓縮演算法又有許多種,所以,影象資料是TIF檔案中最為複雜的部分,暫還沒有哪個軟體能譯出所有的壓縮演算法。
  四、一個 Tif 檔案的例項
  讓我們自己動手做一個實驗,以加深理性認識。
  用系統自帶的畫圖程式新建一個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:檔案頭,可以看出,該圖是Intel整數格式,第一個IFD的偏移量為4E。
0008-0037:影象資料。注意最後那個0是補加的,它沒有統計在“影象資料位元組總數”屬性值中。
0038-003F:水平分辯率值。
0040-0047:垂直分辯率值。
0048-004D:顏色深度值。
004E-0107:第一個IFD。Directory Entry Count的值(004E-004F)為F,表示這個IFD中有15個DE,每個DE佔用12位元組,15個DE共佔用180位元組,加上Directory Entry Count佔用的2位元組,再加上
  Offset to next IFD佔用的4位元組,這個IFD共佔用186位元組,換算為16進位制就是BA,所以,它的資料結束於0107。Offset to next IFD的值(最後4個位元組)均為0,表示整幅影象檔案只有這一個IFD。其中15個DE的描述見表六。
表六 一個Tif檔案例項的DE描述
-------------------------------------------------------------------------
順號   偏移量 TagID    Type       length valueOffset          說明
--------------------------------------------------------------------------
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    影象為真彩色,其值存放在48-4D
5    0080 0103  Integer       1   05    影象資料是壓縮的
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
14  00EC 0128  Integer     1   02    未知屬性值=2
15  00F8 013D  Integer      1   01    未知屬性值=1
--------------------------------------------------------------------------
表六說明
  ①水平分辯率值存放在0038-003F,佔用8個位元組,這8個位元組是:60 00 00 00 01 00 00 00。由於它是分數型別,前4個位元組是分子,其值為60000000,轉換為10進位制就是96,後4個位元組是分母,其值是10000000,轉換為10進位制就是1,所以,分數值是:96/1,它表示每英寸96畫素。
  ②垂直水平分辯率值存放在0040-0047,請參照①進行分析。
  ③顏色深度屬性,它有3個Integer型別的值,共計6位元組,所以valueOffset中存放的也是其值的偏移量。它的屬性值存放在0048-004D,3個整形資料值都為8,表示這是一幅24位真彩色的影象。

轉載地址:http://www.cnblogs.com/gywei/archive/2013/10/29/3393816.html