java – 将RGB像素转换为灰度使暗像素显得偏蓝

我目前正在尝试使用Java中的图像,并尝试使用BufferedImage类将RGB图像转换为灰度图像.

我的想法是获取每个像素的RGB值并将它们设置为(R G B)/ 3:

BufferedImage image = ImageIO.read(new File(file));

int[] pixel;
int r, g, b;

for (int y = 0; y < image.getHeight(); y++)
{
    for (int x = 0; x < image.getWidth(); x++) 
    {
        pixel = image.getRaster().getPixel(x, y, new int[3]);

        r = pixel[0];
        g = pixel[1];
        b = pixel[2];
        int gr = (int)((r+g+b)/3);

        String hex = Integer.toHexString(gr)+Integer.toHexString(gr)+Integer.toHexString(gr);
        int i = Integer.parseInt(hex, 16);

        image.setRGB(x, y, i);
    }
}

ImageIO.write(image, "jpg", new File("im2.jpg"));

结果如下:

java  – 将RGB像素转换为灰度使暗像素显得偏蓝

java  – 将RGB像素转换为灰度使暗像素显得偏蓝

无论这可能是将图像转换为灰度的最低效方式,我不知道为什么会发生这种情况.
我在这里错过了什么?

解决方法:

当十六进制值不是2位数时会发生这种情况.例如. Integer.toHexString(10)返回“a”.

因此,例如,如果r = 10且g = 10且b = 10,您将执行Integer.toHexString(“aaa”),它是蓝色(aa = 170),带有一些绿色(a = 10)并且没有红色.在图像的暗区域中,这种效果会更明显地发生,并且导致大部分是蓝色但是会产生一些绿色效果.

这是图像中一小部分的爆炸,显示出蓝色和轻微的绿化.

java  – 将RGB像素转换为灰度使暗像素显得偏蓝

要修复它,请正确滚动数字.

image.setRGB(x, y, new Color(gr,gr,gr).getRGB());
上一篇:Java旋转ImageBuffer失败


下一篇:java – 为什么我的BufferedImage从ImageIO.read()接收一个空值