读取TIFF文件BitsPerSample和I​​mageWidth

时间:2016-08-16 19:33:58

标签: objective-c tiff

我正在编写一个Objective-C应用程序,它可以以比NSImage更快的方式处理TIFF图像(例如,将图像与它合并,需要花费大量内存空间),所以我从头开始使用Objective-C和C组合的TIFF读写器,以获得最佳性能。

通过阅读Adobe documentation for TIFF files,我已经能够阅读我的TIFF图像的每个元数据,但有一些例外:BitsPerSampleImageWidth。当其他元数据返回可能的值时,BitsPerSample十六进制值/偏移量为fffffffffffffffe(又称。-2),而它有3个值为2(短)的值,这意味着应该有一个偏移量在那个地方,由于TIFF文件的开头是偏移0而文件权重是5.846.655字节,即使它是无符号的,该偏移量也是无效的(18446744073709551614)。

以同样的方式,ImageWidth返回值为944,而图像宽度为1200.因为我可以通过从索引2获取长度为2的短值并比较它来检测该文件是TIFF文件到42,我假设我的shortIntegerFromBytesAtRangeWithEndian功能正在运行。

unsigned short shortIntegerFromBytesAtRangeWithEndian(char* bytes, unsigned long start, unsigned long length, int endian) {
    unsigned short returnedInt = 0;
    BOOL isBigEndian = endian == TIFF_IMAGE_ENDIAN_BIG;

    for (unsigned long index = isBigEndian ? 0 : length-1 ; index < length; index += endian){
        returnedInt = (returnedInt << BYTE_SIZE) + bytes[index + start];
    }

    return returnedInt;
}

endian对于小尾数为-1,对于大尾数为1。

这些变量是否以与其他值不同的方式读取?这些是十六进制和十进制图像的值,大小以字节为单位(我省略了偏移值,因为其中一些太大了):

  • ? (-2): 0(0) - 大小:4
  • ImageWidth(256): 3b0(944) - 尺寸:2
  • ImageLength(257): 320(800) - 尺寸:2
  • 压缩(259): 1(1) - 大小:2
  • PhotometricInterpretation(262): 2(2) - 尺寸:2
  • StripOffsets(273): 5a6c(23148) - 尺寸:4
  • 方向(274): 1(1) - 大小:2
  • SamplesPerPixel(277): 3(3) - 尺寸:2
  • RowsPerStrip(278): 320(800) - 尺寸:2
  • StripByteCounts(279): 56e400(5694464) - 尺寸:4
  • PlanarConfiguration(284): 1(1) - 尺寸:2
  • ResolutionUnit(296): 2(2) - 尺寸:2
  • ? (34665): 583e6c(5783148) - 大小:4

0 个答案:

没有答案