TIFF 圖片格式及webkit中的解碼問題

TIFF (TaglmageFileFormat)圖像文件是由Aldus和Microsoft公司爲桌上出版系統研製開發的一種較爲通用的圖像文件格式。 TIFF格式靈活易變,它又定義了四類不同的格式:TIFF-B適用於二值圖像:TIFF-G適用於黑白灰度圖像;TIFF-P適用於帶調色板的彩色圖像:TIFF-R適用於RGB真彩圖像。

  TIFF支持多種編碼方法,其中包括RGB無壓縮、RLE壓縮及JPEG壓縮等。

  TIFF是現存圖像文件格式中最複雜的一種,它具有擴展性、方便性、可改性,可以提供給IBMPC等環境中運行、圖像編輯程序。

  TIFF圖像文件由三個數據結構組成,分別爲文件頭、一個或多個稱爲IFD的包含標記指針的目錄以及數據本身。

  TIFF圖像文件中的第一個數據結構稱爲圖像文件頭或IFH。這個結構是一個TIFF文件中唯一的、有固定位置的部分;IFD圖像文件目錄是一個字節長度可變的信息塊,Tag標記是TIFF文件的核心部分,在圖像文件目錄中定義了要用的所有圖像參數,目錄中的每一目錄條目就包含圖像的一個參數。

TIF圖像格式概覽

TIF圖由四個部分組成:
1、圖像文件頭(Image File Header簡稱IFH):

TIFF <wbr>文件
圖一 IFH結構描述

  IFH數據結構包含3個成員共計8個字節,Byte order成員可能是“MM”(0x4d4d)或“II”(0x4949),0x4d4d表示該TIFF圖是摩托羅拉整數格式 0x4949表示該圖是Intel整數格式;Version成員總是包含十進制42(0x2a),它用於進一步校驗該文件是否爲TIF格式,42這個數並不是一般人 想象中的那樣認爲是tif軟件的版本,實際上,42這個數大概永遠不會變化;第三個成員是IFD(接下來要說的第二個數據結構)相對文件開始 處的偏移量。

2、圖像文件目錄(Image File Directory簡稱IFD):

TIFF <wbr>文件
圖二 IFD及DE結構描述

  IFD是TIF圖中最重要的數據結構,它包含了一個TIF文件中最重要的信息,一個TIF圖可能有多個IFD,這說明文件中有多個圖像,每個IFD標識1個圖像的基本屬性。 IFD結構中包含了三類成員,Directory Entry Count指出該結構裏面有多少個目錄入口;接下來就是N個線性排列的DE序列,數量不定(這就是 爲什麼稱TIF格式文件爲可擴充標記的文件,甚至用戶可以添加自定義的標記屬性),每個DE標識了圖像的某一個屬性;最後就是一個偏移量, 標識下一個文件目錄相對於文件開始處的位置,當然,如果該TIF文件只包含了一幅圖像,那麼就只有一個IFD,顯然,這個偏移量就等於0;

3、目錄入口(Directory Entry簡稱DE):
  共12個字節,見圖二。簡單說,一個DE就是一幅圖像的某一個屬性。例如圖像的大小、分辨率、是否壓縮、像素的行列數、一個像素由幾位 表示(1位代表黑白兩色,8位代表256色等等)等。其中:tag成員是該屬性的編號,在圖像文件目錄中,它是按照升序排列的。我們可以通過讀 這些編號,然後到TIF格式官方白皮書中查找相應的含義。屬性是用數據來表示的,那麼type就是代表着該數據的類型,TIF官方指定的有5種數據類型。 type=1就是BYTE類型(8位無標記整數)、type=2是ASCII類型(7位ASCII碼加1位二進制0)、type=3是SHORT類型(16位無標記整數)、type=4是LONG 類型(32位無標記整數)、type=5是RATIONAL類型(2個LONG,第一個是分子,第二個是分母)。length成員是數據的數量而不是數據類型的長度。 第4個成員valueOffset很重要,它是tag標識的屬性代表的變量值相對文件開始處的偏移量。如果變量值佔用的空間小於4個字節,那麼該值就存放在 valueOffset中即可,沒必要再另外指向一個地方了。

4、圖像數據 本例提供的圖像是基於256灰度級的,即一個字節代表一個像素點,它是0x00~0xff區間中256個灰度級的任意一個整數。通過使用UltraEdit工具觀察, 我們發現該圖像文件的組織形式是:IFH--數據--IFD。


Webkit 解析 TIFF時 出錯, 所以chrome, android等瀏覽器都無法顯示tiff圖片, 經過分析原來是因爲TIFF 需要等到network加載完數據之後解析, 不支持部分解析。

解決方法: 在ImageSource::setData中 添加條件判斷語句

        if(codec->getFormat() == SkImageDecoder::kTIFF_Format && !allDataReceived) {
            return;
        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章