如何使用Java库将32 bpp映像(ARGB)转换为16 bpp映像(ARGB)?出于我的好奇心,在像素级,这种转换是做什么的?如果我有一个int值,它保存了像素的值(所有通道),那么在转换发生之后,int会有什么不同呢?
转换为16位ARGB值的32位AARRGGBB值如下所示:
int argb = ((aarrggbb & 0x000000F0) >> 4)
| ((aarrggbb & 0x0000F000) >> 8)
| ((aarrggbb & 0x00F00000) >> 12)
| ((aarrggbb & 0xF0000000) >> 16);
它把所有的东西都粘在下面的16位中,并将上面的16位保持为0。
对于每个通道,你失去了较低的4位颜色信息,上面的更重要。这些颜色将被量化到最接近的4位等效值,从而在图像上产生视觉上令人不快的彩色显带效果。
顺便提一句,16位的颜色通常不包括阿尔法成分.通常(虽然不总是如此)它分解为红色5位,绿色6位(因为我们的眼睛对绿色/蓝色最敏感)和5位表示蓝色。
这种转换只会丢失每个通道上的2或3位信息,而不是4位,并且假设源像素不包含alpha。