TIFF图像:16位,RGBA图像像素隔行如何?(TIFF images: How 16bits-R

2019-08-31 08:06发布

我试图对付每通道RGBA TIFF图像16位通过C语言,我无法找到一个关于规范16位图像大量的信息。

在每个通道RGBA图像的8位的情况下,我明白,一个像素被存储为UINT32,并且可以由32位分组为8个比特的4个组(R,G,B,A)被隔行扫描。 然后,处理每信道RGBA图像8位,我做了以下(另见封闭源代码这里 ):

  1. 我的图像数据存储为UINT32标签(使用TIFFReadRGBAImageOriented),我打电话data_tiff
  2. 我去隔行使用下列命令像素: (uint8) TIFFGetR(*data_tiff) (uint8) TIFFGetG(*data_tiff) (uint8) TIFFGetB(*data_tiff) (uint8) TIFFGetA(*data_tiff)

在每个通道RGBA图像的16位的情况下,你能告诉我怎么去隔行像素? 如果我能retreive图像数据作为UINT64选项卡,然后我可以做到以下几点:

#define    TIFF16GetR(abgr)    ((abgr) & 0xffff)
#define    TIFF16GetG(abgr)    (((abgr) >> 16) & 0xffff)
#define    TIFF16GetB(abgr)    (((abgr) >> 32) & 0xffff)
#define    TIFF16GetA(abgr)    (((abgr) >> 48) & 0xffff)`
  1. 我读的图像数据作为UINT64标签
  2. 我使用反交错像素(uint16) TIFF16GetR(*data_tiff) (uint16) TIFF16GetG(*data_tiff) (uint16) TIFF16GetB(*data_tiff) (uint16) TIFF16GetA(*data_tiff)

但似乎数据本身不存储在UINT64选项卡,所以不知道如何被交织每个通道图像16位成UINT32像素标签。

我也面临着处理16位困难灰度化以同样的方式图像(使用TIFFReadRGBAImageOriented得到的图像数据,并试图每个像素转换成UINT16)

更一般地,你有任何一块文档中关于16位灰度和彩色图像的?

谢谢您最好的问候,

雷米A.

Answer 1:

所述TIFFReadRGBAImage高级接口将始终与每样本的8位的精度读出的图像。

为了读取每个通道图像的16位无松动的精度,可以使用TIFFReadScanline直接和读出根据所述数据的正确量SamplesPerPixelBitsPerSample 。 但是,如果图像存储在(已在TIFF 6.0引入了不砖)条这只会工作,必须有唯一一个在每个压缩条列(如果图像被压缩)。

如果你想处理所有类型的TIFF图像的wihout使用TIFFReadRGBAImage那么你必须检测图像格式,并使用低级别的接口,如TIFFReadEncodedStripTIFFReadEncodedTile

需要注意的是,TIFF规格是非常广泛和灵活,并利用这些低级别的接口来处理每一个可能的一种形象的将不是一件容易的事,所以你可以使用一个更高的水平比库增加libtiff如果可以的话会更好。

编辑

你所提到的评论是被称为基线TIFF的TIFF 6.0规范的第一部分

«当TIFF介绍,它的可扩展引发兼容性问题。 在编码的灵活性引起人们TIFF代表成千上万的不兼容的文件格式的笑话。[9] 为了避免这些问题,需要每一个TIFF阅读器来阅读基线TIFF。 基线TIFF不包括图层,或JPEG或LZW压缩。 基线TIFF的正式名称为TIFF 6.0,第1部分:基线TIFF»从维基百科

甲基线TIFF不支持位深度高于8位,所以这就是为什么在基线TIFF的说明书中,的值BitsPerSample为灰度图像只能是4或8和用于在RGB图像只可以是每8位渠道。 较高的比特深度也支持扩展至基线TIFF规范,它不需要一个TIFF阅读器支持他们。

平铺图像也是一个扩展基线规范,其中StripOffsetsStripByteCountsRowsPerStrip字段被替换TileWidthTileLengthTileOffsetsTileByteCounts所以可以通过使用在现有字段寻找区分从剥离图像平铺图像TIFFGetField()



文章来源: TIFF images: How 16bits-RGBA image pixels are interlaced?
标签: c image libtiff