我正在尝试使用小型C程序读取16位灰度TIFF文件(BitsPerSample = 16),以转换为浮点数数组以供进一步分析。根据标题信息,像素数据在2048×2048像素的单个条带中。编码是小端的。
有了这个头信息,我希望能够读取一个2048x2048x2字节的块,并将其解释为2048x2048个2字节整数。我实际得到的是一张1024x1024的图片分成四个象限每个像素,其中较低的两个仅包含零。前两个象限中的每一个看起来都像我期望的整个画面看起来: alt text http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png 结果 如果我将相同文件读入Gimp 或Imagemagick,请告诉我他们必须减少到8位(这对我没有帮助 - 我需要全范围),但像素出现在正确的位置: alt text 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)
ImageWidth(256)LONG(4)1 <!> lt; 2048 <!> gt;
ImageLength(257)LONG(4)1 <!> lt; 2048 <!> gt;
BitsPerSample(258)SHORT(3)1 <!> lt; 16 <!> gt;
压缩(259)短(3)1 <!> lt; 1 <!> gt;
光度学(262)短(3)1 <!> lt; 1 <!> gt;
StripOffsets(273)LONG(4)1 <!> lt; 4096 <!> gt;
方向(274)短(3)1 <!> lt; 1 <!> gt;
RowsPerStrip(278)LONG(4)1 <!> lt; 2048 <!> gt;
StripByteCounts(279)LONG(4)1 <!> lt; 8388608 <!> gt;
XResolution(282)RATIONAL(5)1 <!> lt; 126.582 <!> gt;
YResolution(283)RATIONAL(5)1 <!> lt; 126.582 <!> gt;
ResolutionUnit(296)SHORT(3)1 <!> lt; 3 <!> gt;
34710(0x8796)LONG(4)1 <!> lt; 0 <!> gt;
(标签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()将数据密集地打包在已分配的内存中,而不是将它们打包成长大的parcel。因此,我最终将两行打包成一行,而后半部分则为空。

我已将其更改为循环遍历像素数并每次读取两个字节并将其存储在已分配的内存中:

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归因
不隶属于 StackOverflow
scroll top