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

时间:2009-07-24 11:25:42

标签: java image

如何使用Java库将32bpp图像(ARGB)转换为16bpp图像(ARGB)?对于我的好奇心,在像素级别,这种转换有什么作用?如果我有一个int值来保存像素的值(包含所有通道),那么转换发生后int会如何不同?

2 个答案:

答案 0 :(得分:3)

转换为16位ARGB值的32位AARRGGBB值将是这样的:

int argb = ((aarrggbb & 0x000000F0) >> 4)
         | ((aarrggbb & 0x0000F000) >> 8)
         | ((aarrggbb & 0x00F00000) >> 12)
         | ((aarrggbb & 0xF0000000) >> 16);

它将所有内容都固定在低16位,并将高16位保留为0。

对于每个频道,您丢失较低的4位颜色信息,较高的颜色信息稍微重要一些。颜色将被量化为最接近的4位等效值,从而在整个图像中产生视觉上令人不愉快的色带效果。

顺便提一下,16位颜色通常不包括alpha分量。通常(虽然并非总是如此)它分为5位红色,6位绿色(因为我们的眼睛对绿/蓝颜色最敏感)和5位蓝色。

此转换在每个通道上仅丢失2或3位信息而不是4,并假设源像素不包含alpha。

答案 1 :(得分:-1)

读入图像并以您需要的格式保存。来自http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html

// Create an image to save
RenderedImage rendImage = myCreateImage();

// Write generated image to a file
try {
    // 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时,每个像素的内部表示不会改变(表示丢失除外),但存储在磁盘上的字节将会发生。

相关问题