2009-01-09 200 views
0

我想读取一个16位灰度TIFF文件(BitsPerSample = 16)使用一个小的C程序转换为一个浮点数数组进行进一步分析。根据标题信息,像素数据是单条2048×2048像素的数据。编码是小端。
有了这个头信息,我期待能够读取一个2048x2048x2字节的块,并将其解释为2048x2048的2字节整数。我实际上得到的是每个1024像素的图片split into four quadrants,其中较低的两个仅包含零。前两个象限中的每一个看起来像我期望的整个图片看起来:alt text http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png
如果我读same file into Gimp或Imagemagick,都告诉我,他们必须减少到8位(这并没有帮助我 - 我需要全部范围),但像素在正确的位置出现:alt text http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457_gimp.png 这表明我关于如何将数据排列在一个条内的想法是错误的。另一方面,文件必须根据标题信息正确地格式化,否则Gimp不会正确。我哪里错了?从tiffdump阅读16位灰度TIFF

输出:
15_inRT_0p457.tiff:
魔法:0x4949版本:0x2a
目录0:偏移8(0x8中)下一个0(0)
ImageWidth(256)长(4)1 < 2048 >
ImageLength(257)长(4)1 < 2048>
BitsPerSample(258)SHORT(3)1 < 16>
压缩(259)SHORT(3)1 < 1>
光度(262)SHORT (3)1 < 1>
StripOffsets(273)长(4)1 < 4096>
取向(274)SHORT(3)1 < 1>
RowsPerStrip(278)长(4)1 < 2048>
StripByteCounts(279 )LONG(4)1 < 8388608>
XResolution(282)RATIONAL(5)1 < 126.582>
YResolution(283)RATIONAL(5)1 < 126.582>
ResolutionUnit(296)SHORT(3)1 < 3 >
34710(0x8796)LONG(4)1 < 0>
(标签34710是相机信息;为了确保这不会有什么不同,我已将图像文件目录的末尾到0x1000处的数据起始位置的整个范围归零,并且实际上没有任何区别。)

回答

1

我发现了这个问题 - 它在我的C程序中...

我已分配的内存为多头的阵列,并且使用的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(长)= 4,fread()将数据密集地包装在分配的内存中,而不是将它们打包成长包裹。因此,我最终将两行一起打包成一张,而后半部分则是空的。

我把它改为遍历的像素数量和读取两个字节每次并将其存储在所分配的内存,而不是:

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

你知道如果StripOffsets是一个数组,它是一个偏移量数组的偏移量,对吧?你可能没有正确地做这个解引用。

你的平台是什么?你想做什么?如果你愿意在Windows上使用.NET,my company sells an image processing toolkit,它包含一个TIFF编解码器,它可以处理几乎所有可以抛出的东西,并且会返回16个bpp图像。我们还有许多工具可以在16bpp图像上自然运行。

+0

由于底座。 StripOffsets指向0x1000,这是数据的起始位置 - 距离文件末尾确切为2048x2048x2字节。 我正在运行Linux,而我们所有的数据分析软件包都是用C编写的,所以恐怕我不太可能成为您的客户。 – user53343 2009-01-09 17:47:20