繁体   English   中英

如何从灰度图像中获取白色像素值并将其替换为另一种颜色?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM