用Java将32 bpp映像转换为16 bpp映像

95 阅读1分钟

如何使用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。