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

在Java中将32bpp映像转换为16bpp映像,java,image,Java,Image,如何使用Java的库将32bpp映像(ARGB)转换为16bpp映像(ARGB)?出于好奇,在像素级,这种转换做什么?如果我有一个保存像素值的int值(使用所有通道),在转换发生后,该int值会有什么不同?读取图像并将其保存为所需的格式。从 请参阅javax.imageio.imageio.getWritePerformatNames()的输出,以找到所需的格式 使用16 bpp时,每个像素的内部表示形式不会改变(表示形式丢失除外),但磁盘上存储的字节会改变。转换为16位ARGB值的32位aar

如何使用Java的库将32bpp映像(ARGB)转换为16bpp映像(ARGB)?出于好奇,在像素级,这种转换做什么?如果我有一个保存像素值的int值(使用所有通道),在转换发生后,该int值会有什么不同?

读取图像并将其保存为所需的格式。从

请参阅javax.imageio.imageio.getWritePerformatNames()的输出,以找到所需的格式


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

转换为16位ARGB值的32位aarggbb值如下:

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。

将图像保存为png或jpeg对我有何帮助?仅在图像文件上谈论16 bpp是有意义的。Java在内存中使用未压缩的图像。如果答案没有意义,您可能需要改写问题。谢谢您的详细解释!
int argb = ((aarrggbb & 0x000000F0) >> 4)
         | ((aarrggbb & 0x0000F000) >> 8)
         | ((aarrggbb & 0x00F00000) >> 12)
         | ((aarrggbb & 0xF0000000) >> 16);