使用Java的库如何将32bpp图像(ARGB)转换为16bpp图像(ARGB)?出于好奇,在像素级别上,此转换有什么作用?如果我有一个int值保存一个像素值(具有所有通道),那么在发生转换后,该int会有什么不同?
将32位AARRGGBB值转换为16位ARGB值将是这样的:
int argb = ((aarrggbb & 0x000000F0) >> 4) | ((aarrggbb & 0x0000F000) >> 8) | ((aarrggbb & 0x00F00000) >> 12) | ((aarrggbb & 0xF0000000) >> 16);
它会将所有内容粘贴在低16位中,而将高16位保留为0。
对于每个通道,您会丢失颜色信息的低4位,而高4位则更为重要。颜色将被量化为最接近的4位等效值,从而导致整个图像出现视觉上不愉快的色带效果。
顺便提及,16位颜色通常不包含alpha分量。通常(尽管并非总是如此),它分解为红色的5位,绿色的6位(因为我们的眼睛对绿色/蓝色最敏感)和蓝色的5位。
此转换将丢失每个通道上的2或3位信息,而不是4位,并且将假定源像素不包含alpha。