2013-04-16 46 views
5

我試圖通過C語言處理每通道RGBA TIFF圖像的16位,我無法在規範中找到大量有關16位圖像的信息。TIFF圖像:16bits-RGBA圖像像素是如何交錯的?

在每個通道8位RGBA圖像的情況下,我知道一個像素存儲爲uint32,並且可以通過將32位分組爲4個組(R,G,B,A)8位。 然後處理每個通道RGBA圖像8位時,我做以下(也參見封閉源代碼here):

  1. 我存儲圖像數據作爲UINT32標籤(使用TIFFReadRGBAImageOriented),我打電話data_tiff
  2. 我去隔行像素使用以下命令:(uint8) TIFFGetR(*data_tiff)(uint8) TIFFGetG(*data_tiff)(uint8) TIFFGetB(*data_tiff) & (uint8) TIFFGetA(*data_tiff)

在每信道RGBA圖像的16位的情況下,你能告訴我怎麼我可以去隔行像素嗎? 如果我能retreive圖像數據作爲UINT64選項卡,然後我可以做到以下幾點:

#define TIFF16GetR(abgr) ((abgr) & 0xffff) 
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff) 
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff) 
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)` 
  1. 我使用(uint16) TIFF16GetR(*data_tiff)(uint16) TIFF16GetG(*data_tiff)讀取圖像數據作爲UINT64標籤
  2. 我去隔行像素,(uint16) TIFF16GetB(*data_tiff) & (uint16) TIFF16GetA(*data_tiff)

但似乎數據並非本地存儲在uint64選項卡,所以我不知道如何隔行掃描16位每通道圖像到一個uin t32像素選項卡。

處理16位,我也面臨着困難灰度化(使用TIFFReadRGBAImageOriented得到的圖像數據,並試圖每個像素轉換成UINT16)

更普遍地以同樣的方式的圖像,你有任何一塊有關16位灰度和彩色圖像的文檔?

謝謝 最好的問候,

雷米A.

+1

你是什麼意思的上面的單詞「選項卡」?我無法解析......應該是「桌子」,也許吧? – unwind

+0

我的意思是一個指針:uint32 * –

回答

6

TIFFReadRGBAImage高層次的接口將始終與每個樣本8位的精度讀取圖像。

爲了在不失去精度的情況下讀取每個通道的16位圖像,可以直接使用TIFFReadScanline並根據SamplesPerPixelBitsPerSample讀取正確的數據量。但是,如果圖像存儲在條帶中(而不是在TIFF 6.0中引入的圖塊),並且每個壓縮條帶(如果圖像被壓縮)中只有一行,則這隻會起作用。

如果你想處理所有樣的TIFF圖像的wihout使用TIFFReadRGBAImage那麼你必須檢測圖像格式,並使用低級別的接口,如TIFFReadEncodedStripTIFFReadEncodedTile

請注意,TIFF規範非常廣泛和靈活,並且使用這些低級別接口來處理各種可能類型的圖像並不是一件容易的事情,所以如果您使用高級庫比使用libtiff更好能夠。

編輯

什麼你是指在評論是被稱爲基線TIFF

«當引入TIFF的TIFF 6.0規範的第一部分,它的可擴展挑起兼容性 問題。編碼的靈活性引發了一個笑話,TIFF 代表成千上萬的不兼容文件格式。[9]爲了避免這些問題,每個TIFF閱讀器都需要閱讀Baseline TIFF。 基線TIFF不包含圖層,或者使用JPEG或 LZW進行壓縮。基線TIFF的正式名稱爲TIFF 6.0,第1部分:基線 TIFF從Wikipedia

一個基線TIFF»不支持位深度高於8位,所以這就是爲什麼在基線TIFF的規格,對於灰度圖像的值BitsPerSample只能是4或8,對於RGB圖像,每個通道只能有8位。作爲Baseline TIFF規範的擴展,支持更高的比特深度,並且不需要以支持TIFF閱讀器,因此需要

平鋪圖像也是一個擴展基線規範,其中StripOffsetsStripByteCounts,和RowsPerStrip字段由TileWidthTileLengthTileOffsetsTileByteCounts代替,從而可以通過使用在現有字段尋找區分從剝離圖像平鋪圖像TIFFGetField()

+0

謝謝你的回答,我可以讀一些你在網上建議的東西,它也表示面向掃描線接口的主要限制,除了需要首先識別現有文件因爲擁有合適的組織,只有當數據未以壓縮格式存儲時,或者圖像數據條的行數設置爲1(RowsPerStrip爲1)時,才能隨機訪問各條掃描線。這意味着處理16位圖像的這種方式對於任何16位圖像都無效,您是否知道另一種方法來實現這一點? –

+0

是的,我編輯了我的答案,明確了掃描線方法的侷限性。 – zakinster

+0

好的謝謝你這個非常完整的答案。 我會很樂意使用高級庫,但我介紹的依賴性越少,它就越好...... –