TIFF圖像文件格式詳解

from:https://www.cnblogs.com/gywei/p/3393816.html

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結構描述
名稱字節數數據類型說明
Byteorder2IntegerTIF標記,其值為4D4D或4949
Version2Integer版本號,其值恒為2A00
Offset to first IFD4Long第一個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 Count2Integer本IFD中DE的數量
Directory Entry(1)12?簡稱DE,中文譯義“目錄項”
Directory Entry(2)12??
.。。。。。。。???
Directory Entry(N)12??
Offset to next IFD4Long下一個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結構描述
名稱字節數數據類型說明
tag2Integer本屬性的標簽編號
type2Integer本屬性值的數據類型
length4Long該類型數據的數量
valueOffset4Long屬性值的存放偏移量
????

表三說明
  由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調色板偏移量0003256色和16色圖像才有此屬性,而且有連續2個調色板,但屬性的length值只表示出1個調色板

表四說明
  ①“水平(垂直)分辯率”是分數型的屬性,其值要占用8個字節,所以在valueOffset中存放的肯定是它的具體數值的偏移量,而不是數值本身。
  ②“生成圖像的軟件名稱”和“生成圖像的時間”這兩個字符型屬性,它們的值所占用的空間也會大于4字節,所以在valueOffset中存放的也是它們的值的偏移量,而不是值本身。
  ③“圖像數據字節總數”一般是個偶數,如果是奇數,那么實際存放時會在后面加一個0,但這個0不會計算在字節總數之內。

表五 DE中的數據類型
type值數據類型說明
0001Byte?
0002Ascii文本類型,7位Ascii碼加1位二進制0
0003Integer?
0004Long?
0005RATIONAL分數類型,由兩個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.pswp.cn/news/458150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458150.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 抽象工廠模式簡單實例

抽象工廠模式:提供一個創建一系列的相關的或者依賴的對象的接口,無需指定它們的具體實現類,具體的時間分別在子類工廠中產生。 類似于工廠模式:隔離了具體類的生產實現,使得替換具體的工廠實現類很容易。包含有以下模塊…

圖像處理之積分圖應用三(基于NCC快速相似度匹配算法)

from:https://blog.csdn.net/jia20003/article/details/53021614 圖像處理之積分圖應用三(基于NCC快速相似度匹配算法) 基于Normalized cross correlation(NCC)用來比較兩幅圖像的相似程度已經是一個常見的圖像處理手段。在工業生產環節檢測…

深入淺出地理解機器人手眼標定

from:https://blog.csdn.net/qq_16481211/article/details/79764730 所謂手眼系統,就是人眼鏡看到一個東西的時候要讓手去抓取,就需要大腦知道眼鏡和手的坐標關系。如果把大腦比作B,把眼睛比作A,把手比作C,如果A和B的…

centos 6.5 安裝 mongodb

官方給出的鏈接地址:https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 安裝后重要的日志 win10 上使用mongochef連接不上數據庫 解決方案: 修改 /etc/mongod.conf 將bindIP 改為0.0.0.0 監聽外網轉載于:https://www.cnblogs.com/l…

scala學習資料

1. scala-sbt 構建工具: http://www.scala-sbt.org/0.13/docs/zh-cn/Directories.html 2. 資料: http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/ https://www.zhihu.com/question/34548588?sortcreated http://nerd-is.in/2013-09/scala…

opencv3/C++ 機器學習-SVM應用實例:藥品(膠囊)識別與分類

from:https://blog.csdn.net/akadiao/article/details/79278072 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/akadiao/article/details/79278072 問題描述: 現對6種不同顏色藥品(膠囊…

Elasticsearch 搜索不到數據問題(_mapping 設置)

需求 由于 kibana3 中,不支持直接在請求的 url 中設置搜索的 type (是不是我不知道???)。 為了支持特定 type 的搜索,所以我設置了個下每個 panel 的查詢語句,讓它增加一個&#xff…

SVM之交叉驗證【轉】

交叉驗證(CrossValidation)方法思想簡介 以下簡稱交叉驗證(Cross Validation)為CV.CV是用來驗證分類器的性能一種統計分析方法,基本思想是把在某種意義下將原始數據(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set),首先用訓練集對分類器進…

linux命令學習-1-less

less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。在 more 的時候,我們并沒有辦法向前面翻, 只能往后面看,但若使用了 less …

python問題匯總

問題1:如何解決python3中numpy報錯No module named numpy 打開terminal pip3 install numpy 問題2:ModuleNotFoundError No module named matplotlib 打開terminal pip3 install matplotlib

jspspy database help

.轉載于:https://www.cnblogs.com/outline/p/5316051.html

SVM 調參策略

轉自:SVM 調參策略:https://blog.csdn.net/u014484783/article/details/78220646 SVM 怎樣能得到好的結果 1. 對數據做歸一化(simple scaling) 2. 應用 RBF kernel 3. 用cross-validation和grid-search 得到最優的c和g 4. 用…

美好的?天 從ActionTab開始 美觀、智能、?效的新標簽? iTab 新標簽頁iTab新標簽頁Atop100工具推薦

文章目錄 ActionTabiTab 新標簽頁iTab新標簽頁,小組件,起始頁,標簽頁,日歷,股票,瀏覽器擴展 https://www.actiontab.cn/ ActionTab 收費???? iTab 新標簽頁iT…

Oracle學習之merge

--使用merge語句 create table new as select * from emp where 10; insert into new (empno,ename) select empno,ename from emp where deptno10;merge into new n using emp e on (n.empnoe.empno) when matched then update set n.sale.salwhen not matched then insert (…

機器學習中的算法(2)-支持向量機(SVM)基礎

from:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html 版權聲明: 本文由LeftNotEasy發布于http://leftnoteasy.cnblogs.com, 本文可以被全部的轉載或者部分使用,但請注明出處,如果有問題,請聯系wheeleastgm…

HDU 2586 How far away ?【LCA】

題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid2586 題意: 無向圖,給定邊及邊權重,任意兩點之間都有一條唯一的道路,道路上每個點只能出現一次。給定詢問,求詢問的結點之間的距離。 分析&#xff1…

深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT條件

from:https://blog.csdn.net/xianlingmao/article/details/7919597 在求取有約束條件的優化問題時,拉格朗日乘子法(Lagrange Multiplier) 和KKT條件是非常重要的兩個求取方法,對于等式約束的優化問題,可以應用拉格朗日乘子法去求…

android一些若干回調測試

1.activity:onAttachedToWindow在onResume后回調 2.onCreate和onResume調用間隔為29ms, onAttachedToWindow和OnResume相差11ms, viewTreeObserver:OnGloballayout和onAttachedtoWindow相差19ms 注:以上的測試時間間隔不能保證精確相同,但是可以從中看出…

Kinect深度圖與攝像頭RGB的標定與配準(轉載文章)

作者原文地址:http://blog.csdn.net/aichipmunk/article/details/9264703 自從有了Kinect,根據深度圖提取前景就非常方便了。因此出現了很多虛擬現實、視頻融合等應用。但是,Kinect自身的RGB攝像頭分辨率有限,清晰度也不及一些專業…

臺北到淡水版Firefox無法播放視頻

臺北到淡水版的Firefox所有的視頻都無法播放,禁用了各種插件也還是沒法播放,最后才確定是SWF的問題,大家有同樣問題的,可以下載我的放到SWF文件夾下,目錄結構如下圖: ?Firefox的SWF下載地址1 ?Firefox的S…