[英]How can I get white colored pixel value from gray scale image and replace it with another color?
我试图从GrayScale图像中获取白色像素的值,并将其替换为另一种Color,但是当我运行代码时,整个GrayScale图像都将转移到另一Color。 谁能告诉我代码中的错误在哪里,或者我怎么得到我想要的结果? 这是代码...
public class gray {
public static void main (String args[])throws IOException{
int width;
int height;
BufferedImage myImage = null;
File f = new File("E:\\eclipse\\workspace\\Graphs\\src\\ColorToGray\\1.png");
myImage = ImageIO.read(f);
width = myImage.getWidth();
height = myImage.getHeight();
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
int pixels[];
pixels = new int[width * height];
myImage.getRGB(0, 0, width, height, pixels, 0, width);
for (int i = 0; i < pixels.length; i++) {
if (pixels[i] == 0xFFFFFF) {
pixels[i] = 0x000000FF;
}
}
File f2 = new File("E:\\eclipse\\workspace\\Graphs\\src\\ColorToGray\\out 1.png");
image.setRGB(0, 0, width, height, pixels, 0, width);
ImageIO.write( image, "jpg", f2);
}
}
之前的图像:
图片后:
我调查了一下,发现了很多问题。
首先,在指定要保存的文件名时,提供了“ .png”扩展名,但是在调用ImageIO.write()
函数时,则指定了文件类型“ jpg”。 这往往效果不佳。 如果您尝试打开生成的文件,大多数程序将给您“这不是有效的.PNG文件”错误。 Windows资源管理器试图变得聪明,然后将.PNG重新解释为.JPG,但这使您避免了发现错误的机会。
这样可以解决奇怪的发红问题。
但是,如果在ImageIO.write()
指定“ png”,则仍然无法获得正确的图像。 人们可能希望图像看起来与原始图像非常相似,只有一些蓝色区域曾经是明亮的白色,但是相反,我们得到的是原始图像的整体更明亮的版本。
我没有足够的时间查看您的原始图像以找出真正的问题所在,但是我怀疑它实际上是一个带有alpha蒙版的明亮图像,从而使它看起来不太亮,并且该图像存在问题。保存图像的方式会去除Alpha信息,从而明显增加亮度。
因此,我用另一个我不知道有技巧的图像尝试了您的代码,但您的代码似乎仍然无能为力。 事实证明,您从myImage.getRGB();
获得的int
值的ARGB格式myImage.getRGB();
对于“ A”返回255,这意味着您需要检查0xFFFFFFFF,而不是0x00FFFFFF。
当然,当您替换一个值时,必须用0xFF0000FF替换它,并指定一个完整的alpha值。 用0x000000FF替换像素没有可见效果,因为不管高蓝色值如何,alpha都为零,因此该像素将变为透明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.