簡體   English   中英

讀取16位灰度TIFF

[英]reading 16-bit greyscale TIFF

我正在嘗試使用一個小型C程序讀取16位灰度TIFF文件(BitsPerSample = 16),以將其轉換為浮點數數組,以進行進一步分析。 根據標題信息,像素數據位於2048x2048像素的單個條帶中。 編碼是小端的。
有了該標頭信息,我期望能夠讀取一個2048x2048x2字節的塊並將其解釋為2048x2048 2字節整數。 實際上,我得到的是將一張圖片分成四個象限 ,每個象限為1024x1024像素,其中下兩個僅包含零。 前兩個象限中的每個象限都像我期望的那樣: 替代文本http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png
如果我將同一文件入Gimp或Imagemagick,兩者都告訴我它們必須減小到8位(這對我沒有幫助-我需要整個范圍),但是像素會在正確的位置出現: alt文本http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457_gimp.png這表明我關於數據如何在同一條帶中排列的想法是錯誤的。 另一方面,必須根據標題信息正確格式化文件,否則Gimp無法正確處理文件。 我要去哪里錯了?

tiffdump的輸出:
15_inRT_0p457.tiff:
魔術:0x4949版本:0x2a
目錄0:偏移量8(0x8)下一個0(0)
圖像寬度(256)長(4)1 <2048>
ImageLength(257)長(4)1 <2048>
BitsPerSample(258)簡短(3)1 <16>
壓縮(259)短(3)1 <1>
光度(262)短路(3)1 <1>
StripOffsets(273)長(4)1 <4096>
方向(274)短(3)1 <1>
行數(278)長(4)1 <2048>
StripByteCounts(279)長(4)1 <8388608>
XResolution(282)有理(5)1 <126.582>
Y分辨率(283)有理(5)1 <126.582>
分辨率單位(296)簡短(3)1 <3>
34710(0x8796)長(4)1 <0>
(標簽34710是相機信息;為確保這不會造成任何影響,我將整個范圍從圖像文件目錄的末尾到數據開頭的0x1000歸零,但實際上並沒有有任何區別。)

我發現了問題-它在我的C程序中...

我已經為一個long數組分配了內存,並使用fread()讀取了數據:

#define PPR 2048;
#define BPP 2;
long *pix;
pix=malloc(PPR*PPR*sizeof(long));
fread(pix,BPP,PPR*PPR,in);

但是,由於數據以2字節塊(BPP = 2)的形式出現,但是sizeof(long)= 4,因此fread()將數據密集地打包在分配的內存中,而不是將它們打包成長大小的數據包。 因此,我最終將兩行打包成一幅,而后半部分為空白。

我將其更改為遍歷像素數並每次讀取兩個字節並將它們存儲在分配的內存中:

for (m=0;m<PPR*PPR;m++) {
  b1=fgetc(in);
  b2=fgetc(in);
  *(pix+m)=256*b1+b2;
}

您了解,如果StripOffsets是一個數組,則它是一個偏移量數組的偏移量,對嗎? 您可能沒有正確執行該取消引用。

您的平台是什么? 你想做什么? 如果您願意在Windows上的.NET中工作,則我公司出售一種圖像處理工具箱 ,其中包含TIFF編解碼器,該編解碼器幾乎可以處理您可以扔到的任何東西,並且將返回16 bpp圖像。 我們還有許多工具可以在16bpp圖像上本地運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM