我想确认我对PNG文件格式描述的解释在颜色类型0x02和存在tRNS块的情况下是正确的。在PNG网站上说:
对于颜色类型0或2,每个样本使用两个字节,而不管图像位深如何(请参见7.1:整数和字节顺序)。指定的灰色样本值或RGB样本值的像素被视为透明的(等效于alpha值0);所有其他像素都应视为完全不透明(alpha值2bitdepth-1)。如果图像位深度小于16,则使用最低有效位,其他则为0。
给出相同的tRNS块:
Length: 6
Type: tRNS
Data: 00 ff 00 ff 00 ff
CRC: 37581b7d
这对RRGGGBBB而言是否意味着:0xFFFFFF,还是将白色视为透明,而所有其他颜色都保持原样?如果是这样,那么在一般情况下,我需要构造一个这种颜色的数组(例如int数组),并且在IDAT块的解码期间,我需要查找该颜色是否为透明颜色之一,如果是,它被视为(RRGGBBAA)0xRRGGBB00,还是完全透明?在这种情况下,什么是好的LUT?
谢谢!
最佳答案
您的解释是正确的。
我需要查找颜色是否为透明颜色之一,
实际上不是透明颜色,而是透明颜色:在truecolor + TRNS场景中,除一种颜色外,所有颜色都是不透明的。
在这种情况下,什么是好的LUT?
我认为这种情况与LUT无关。将这种格式视为存储具有“硬”(是/否)透明度的真彩色图像的有效方法。解码器通常将对添加了alpha通道的图像进行解码(然后实际上会忽略颜色)(例如,您可以在此处看到lineToARGB32方法),或者通过忽略TRNS来进行解码。
请注意,这种truecolour + TRNS情况不是很常见,使用这种格式的PNG图像不多,许多读者在这种情况下只是忽略了TRNS。