首页 文章

读取16位灰度TIFF

提问于
浏览
0

我正在尝试使用小型C程序读取16位灰度TIFF文件(BitsPerSample = 16),以转换为浮点数数组以供进一步分析 . 根据 Headers 信息,像素数据在2048×2048像素的单个条带中 . 编码是小端的 .
有了这个头信息,我希望能够读取2048x2048x2字节的单个块并将其解释为2048x2048个2字节整数 . 我实际得到的是每张1024x1024像素的图片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这表明我对如何在一个条带内排列数据的想法是错误的 . 另一方面,文件必须根据 Headers 信息正确格式化,否则Gimp不会正确 . 我哪里错了?

tiffdump的输出:
15_inRT_0p457.tiff:
魔术: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>
压缩(259)短(3)1 <1>
光度学(262)短(3)1 <1>
StripOffsets(273)LONG(4)1 <4096>
方向(274)短(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处的数据开始,并且实际上没有任何区别 . )

2 回答

  • 0

    我发现了问题 - 这是我的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;
    }
    
  • 1

    你知道如果StripOffsets是一个数组,它是一个偏移数组的偏移,对吧?你可能没有正确地进行这种解除引用 .

    什么's your platform? What are you trying to do? If you'愿意在Windows上运行.NET,my company sells an image processing toolkit包含一个TIFF编解码器,可以处理几乎任何你可以投入的东西,并将返回16 bpp图像 . 我们还有许多工具可以在16bpp图像上进行原生操作 .

相关问题