0

我正在尝试使用小型 C 程序读取 16 位灰度 TIFF 文件 (BitsPerSample=16) 以转换为浮点数数组以进行进一步分析。根据标题信息,像素数据位于 2048x2048 像素的单个条带中。编码是小端的。
有了这些标头信息,我期望能够读取一个 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:
Magic:0x4949 版本:0x2a
目录 0:偏移量 8 (0x8) 下一个 0 (0)
ImageWidth (256) LONG (4) 1<2048>
ImageLength (257) LONG (4) 1<2048 >
BitsPerSample (258) SHORT (3) 1<16>
Compression (259) SHORT (3) 1<1>
Photometric (262) SHORT (3) 1<1>
StripOffsets (273) LONG (4) 1<4096>
方向(274) SHORT (3) 1<1>
RowsPerStrip (278) LONG (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 处数据开头的整个范围归零,实际上并没有有什么不同。)

4

2 回答 2

1

我发现了问题 - 它在我的 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;
}
于 2009-01-09T18:25:28.407 回答
0

你明白,如果 StripOffsets 是一个数组,它就是一个偏移量数组的偏移量,对吧?您可能没有正确地取消引用。

你的平台是什么?你想做什么?如果你愿意在 Windows 上使用 .NET,我的公司出售一个图像处理工具包,其中包括一个 TIFF 编解码器,它可以处理几乎任何你可以扔给它的东西,并将返回 16 bpp 图像。我们还有许多在 16bpp 图像上原生运行的工具。

于 2009-01-09T14:38:45.167 回答