Java,图像正在更改为错误的 rgb 值

Java, image is changing to wrong rgb values

我写了一个 java 代码来将黑白图像的所有红色值更改为 255,因此输出将是红色图像。 但它不是红色,而是输出更亮的图像。 我做错了什么?

 File bwgFile = new File("X:/Java/Documents/NetBeansProjects/colour/input/bwg.png");
BufferedImage bwgImage = ImageIO.read(bwgFile);
int width=bwgImage.getWidth();
int height=bwgImage.getHeight();
for(int w=0; w<width; w++){
  for(int h=0; h<height; h++){
      int pixel = bwgImage.getRGB(w,h);
      Color bwg = new Color(pixel);
      int c=bwg.getRed();
      Color red = new Color(255,c,c);
      int cpixel = red.getRGB();
      bwgImage.setRGB(w,h,cpixel);
  }
}
    ImageIO.write(bwgImage, "png", new File("X:/Java/Documents/NetBeansProjects/colour/output/c.png")); 

input output

编辑: 我发现了问题所在,显然当输入是灰度图像时,它会尝试使输出成为灰度图像,从而在移除蓝色和绿色时使其变暗,在添加红色时使其变亮。不使用灰度图像作为输入修复它。

如果我明白您要做什么,您是在尝试创建灰度图像,只不过它是 "redscale",仅使用红色阴影。因此,您需要计算每个像素的灰度常数。

来自维基百科(Greyscale),一个像素Y的亮度=0.2126R + 0.7152G + 0.0722B。所以,试试这个

int pixel = bwgImage.getRGB(w,h);
Color bwg = new Color(pixel);
float c = (0.2126f * bwg.getRed() + 0.7152f * bwg.getGreen() + 0.0722f * bwg.getBlue());
int cc = (int)Math.round(c);
Color red = new Color(cc, 0, 0);
int cpixel = red.getRGB();
bwgImage.setRGB(w,h,cpixel);

或者,您可以简单地保留红色分量并将绿色和蓝色设置为 0。这将使您只剩下每个像素的 "redness"。

int pixel = bwgImage.getRGB(w,h);
Color bwg = new Color(pixel);
int c=bwg.getRed();
Color red = new Color(c,0,0);
int cpixel = red.getRGB();
bwgImage.setRGB(w,h,cpixel);

注意: 上述解决方案仅适用于未使用 IndexColorModel 的图像。您可以使用 BufferedImage 的 getColorModel() 检查颜色模型。对于 IndexColorModelsetRGB() 不会直接起作用,而是根据 HaraldK 的评论在索引中选择最接近设置颜色的颜色。要使用 IndexColorModel 获得所需的图像结果,您可以使用 TYPE_INT_ARGB:

创建一个新的 BufferedImage
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

然后,将计算出的像素颜色写入此新图像并保存新图像。