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

时间:2016-03-08 07:04:10

标签: java colors rgb bufferedimage javax.imageio

我编写了一个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

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

1 个答案:

答案 0 :(得分:0)

如果我理解你要做的是什么,那么你正试图创建一个灰度图像,除了它是“红色”,只使用红色阴影。因此,您需要计算每个像素的灰度常量。

从维基百科(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.这将使您只有每个像素的“红色”。

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);

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