我试图通过C语言来处理每通道16位的RGBA TIFF图像,在规范中找不到很多关于16位图像的信息。
对于每通道8位的RGBA图像,我理解一个像素被存储为一个uint32,并且可以通过将32位分组成4组(R,G,B,A) 8位来去隔行。然后,为了处理每个通道的8位RGBA映像,我执行以下操作(请参见附件中的源代码这里):
data_tiff(uint8) TIFFGetR(*data_tiff)、(uint8) TIFFGetG(*data_tiff)、(uint8) TIFFGetB(*data_tiff)和(uint8) TIFFGetA(*data_tiff)在每通道RGBA图像16位的情况下,你能告诉我如何去交错像素吗?如果可以将图像数据还原为uint64选项卡,则可以执行以下操作:
#define TIFF16GetR(abgr) ((abgr) & 0xffff)
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff)
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff)
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)`(uint16) TIFF16GetR(*data_tiff)、(uint16) TIFF16GetG(*data_tiff)、(uint16) TIFF16GetB(*data_tiff)和(uint16) TIFF16GetA(*data_tiff)来分隔像素但是,数据似乎不是本机存储在uint64选项卡中的,所以我想知道如何将每条通道图像的16位交织成一个uint32像素选项卡。
我还面临同样的处理16位灰度图像的困难(使用TIFFReadRGBAImageOriented获取图像数据,并尝试将每个像素转换为uint16)。
更普遍地说,你有16位灰度和彩色图像的文档吗?
谢谢,最诚挚的问候,
Rémy A.
发布于 2013-04-16 10:25:23
TIFFReadRGBAImage高级接口将始终以每样8位的精度读取图像.
为了在不影响精度的情况下读取每通道图像16位,您可以直接使用TIFFReadScanline,并根据SamplesPerPixel和BitsPerSample读取正确的数据量。但是,只有当图像存储在条形中(而不是TIFF 6.0中引入的瓷砖)并且每个压缩条中必须只有一行时(如果图像被压缩),这才能起作用。
如果您想使用TIFFReadRGBAImage处理所有类型的TIFF图像wihout,那么您必须检测图像格式,并使用低级接口,如TIFFReadEncodedStrip和TIFFReadEncodedTile。
请注意,TIFF规范是非常广泛和灵活的,使用这些低级接口来处理每一种可能的图像将不是一件容易的事情,所以如果可以的话,使用更高级别的库可能比使用libtiff更好。
编辑
您在注释中所指的是TIFF 6.0规范的第一部分,称为基准TIFF
在引入TIFF时,它的可扩展性引发了兼容性问题。编码的灵活性引起了一个笑话: TIFF代表数以千计的不兼容的文件格式。9为了避免这些问题,每个TIFF阅读器都必须读取基准TIFF。基线TIFF不包括图层,也不包括JPEG或LZW压缩。基线TIFF正式称为TIFF 6.0,第1部分:来自维基百科的基准TIFF
基准TIFF不支持比8位更高的位深度,所以在基准TIFF的规范中,灰度图像的BitsPerSample值只能是4或8,而RGB图像的每个通道只能是8位。作为基准TIFF规范的扩展,支持更高的位深度,而TIFF阅读器不需要它来支持它们。
平铺图像也是对基线规范的扩展,其中StripOffsets、StripByteCounts和RowsPerStrip字段被TileWidth、TileLength、TileOffsets和TileByteCounts取代,因此您可以通过使用TIFFGetField()查看现有字段来区分平铺图像和剥离图像。
https://stackoverflow.com/questions/16034121
复制相似问题