gpt4 book ai didi

java - 将 RGB 像素转换为灰度会使暗像素呈现蓝色

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:09:17 24 4
gpt4 key购买 nike

我目前正在 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"));

结果是这样的:

enter image description here

enter image description here

尽管这可能是将图像转换为灰度的最低效的方法,但我不知道为什么会这样。我在这里缺少什么?

最佳答案

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

因此,例如,如果 r = 10g = 10b = 10 您将执行 Integer。 toHexString("aaa") 非常蓝 (aa = 170) 带有一点绿色 (a = 10)而且没有红色。这种效果在图像的黑暗区域显然会发生得更多,并导致主要是蓝色但有些偏绿色的效果。

这是您图像的一小部分的放大图,显示了蓝色和轻微的绿色。

A sample from your image showing blues and a little green

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

image.setRGB(x, y, new Color(gr,gr,gr).getRGB());

关于java - 将 RGB 像素转换为灰度会使暗像素呈现蓝色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33673992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com