【问题标题】:reading 16-bit greyscale TIFF读取 16 位灰度 TIFF
【发布时间】:2011-02-16 08:50:21
【问题描述】:

我正在尝试使用一个小型 C 程序读取 16 位灰度 TIFF 文件 (BitsPerSample=16),以将其转换为浮点数数组以供进一步分析。根据标题信息,像素数据位于 2048x2048 像素的单个条带中。编码是小端的。
使用该标头信息,我期望能够读取 2048x2048x2 字节的单个块并将其解释为 2048x2048 2 字节整数。我实际上得到的是一张图片split into four quadrants,每张 1024x1024 像素,其中较低的两个仅包含零。前两个象限中的每一个看起来都像我预期的那样: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 的输出:
15_inRT_0p457.tiff:
魔法:0x4949 版本:0x2a
目录 0:偏移量 8 (0x8) 下一个 0 (0)
图像宽度 (256) 长 (4) 1
图像长度 (257) 长 (4) 1
BitsPerSample (258) 短 (3) 1
压缩 (259) 短路 (3) 1
光度 (262) 短路 (3) 1
StripOffsets (273) LONG (4) 1
方向 (274) 短 (3) 1
RowsPerStrip (278) 长 (4) 1
StripByteCounts (279) LONG (4) 1
XResolution (282) RATIONAL (5) 1
Y分辨率 (283) 合理 (5) 1
分辨率单位 (296) 短路 (3) 1
34710 (0x8796) 长 (4) 1
(标签 34710 是相机信息;为了确保这不会产生任何影响,我已将从图像文件目录末尾到 0x1000 数据开头的整个范围归零,实际上这并没有有什么不同。)

【问题讨论】:

    标签: c tiff


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      你的平台是什么?你想做什么?如果您愿意在 Windows 上的 .NET 中工作,my company sells an image processing toolkit 包括一个 TIFF 编解码器,可以处理几乎任何您可以扔给它的东西,并将返回 16 bpp 图像。我们还有许多工具可以在 16bpp 图像上进行原生操作。

      【讨论】:

      • 感谢底座。 StripOffsets 指向 0x1000,它是数据的开头 - 它距离文件末尾正好 2048x2048x2 个字节。我在运行 Linux,我们所有的数据分析包都是用 C 编写的,所以恐怕我不太可能成为你的客户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2014-08-09
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多