在Java中将32bpp图像转换为16bpp图像

如何使用Java库将32bpp图像(ARGB)转换为16bpp图像(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。

读入图像并以您需要的格式保存。 来自http://sofzh.miximages.com/java/ Save as PNG File file = new File(newimage.png”); ImageIO.write(rendImage, “png”, file); // Save as JPEG file = new File(“newimage.jpg”); ImageIO.write(rendImage, “jpg”, file); } catch (IOException e) { }

请参阅javax.imageio.ImageIO.getWriterFormatNames()的输出以找到所需的格式。

当使用16 bpp时,每个像素的内部表示不会改变(除了表示丢失),但存储在磁盘上的字节将是。