我正在编写一个Objective-C应用程序,它可以以比NSImage更快的方式处理TIFF图像(例如,将图像与它合并,需要花费大量内存空间),所以我从头开始使用Objective-C和C组合的TIFF读写器,以获得最佳性能。
通过阅读Adobe documentation for TIFF files,我已经能够阅读我的TIFF图像的每个元数据,但有一些例外:BitsPerSample
和ImageWidth
。当其他元数据返回可能的值时,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。
这些变量是否以与其他值不同的方式读取?这些是十六进制和十进制图像的值,大小以字节为单位(我省略了偏移值,因为其中一些太大了):