我目前正在尝试使用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"));
结果如下:
无论这可能是将图像转换为灰度的最低效方式,我不知道为什么会发生这种情况.
我在这里错过了什么?
解决方法:
当十六进制值不是2位数时会发生这种情况.例如. Integer.toHexString(10)返回“a”.
因此,例如,如果r = 10且g = 10且b = 10,您将执行Integer.toHexString(“aaa”),它是蓝色(aa = 170),带有一些绿色(a = 10)并且没有红色.在图像的暗区域中,这种效果会更明显地发生,并且导致大部分是蓝色但是会产生一些绿色效果.
这是图像中一小部分的爆炸,显示出蓝色和轻微的绿化.
要修复它,请正确滚动数字.
image.setRGB(x, y, new Color(gr,gr,gr).getRGB());