我编写了一个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"));
编辑: 我已经发现了问题所在,显然当输入是灰度图像时,它会尝试使输出成为灰度图像,因此当蓝色和绿色被移除时会变暗,而当添加红色时会变亮。不使用灰度图像作为输入修复它。
答案 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()
检查颜色模型。对于IndexColorModel
,setRGB()
不能直接使用,而是根据HaraldK的评论选择最接近设定颜色的索引中的颜色。要使用IndexColorModel
获得所需的图像结果,可以使用TYPE_INT_ARGB创建一个新的BufferedImage:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
然后,将计算出的像素颜色写入此新图像并改为保存新图像。