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

How can I get white colored pixel value from gray scale image and replace it with another color?

我正在尝试从 GrayScale 图像中获取 White Colored pixel 的值并将其替换为 另一个 Color 但是当我 运行 我的代码时,整个 GrayScale 图像被转移到 another 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);

    }
}

前图:

Image Before Output

之后的图像:

Image After Output

我调查了一下,发现了一堆问题。

首先,当指定要保存的文件名时,您提供了“.png”扩展名,但是当您调用ImageIO.write() 函数时,您指定文件类型"jpg"。这往往效果不佳。如果您尝试打开生成的文件,大多数程序都会给您一个 "this is not a valid .PNG file" 错误。 Windows 资源管理器试图变得聪明,并将 .PNG 重新解释为 .JPG,但这使您免于发现错误的机会。

这解决了奇怪的发红问题。

但是,如果您在 ImageIO.write() 中指定 "png",您仍然无法获得正确的图像。人们会期望一张看起来与原始图像最相似的图像,只有一些蓝色斑点曾经是明亮的白色,但我们得到的是原始图像的整体更亮的版本。

我没有足够的时间查看你的原始图像以找出它真正的问题所在,但我怀疑它实际上是一张带有 alpha 蒙版的明亮图像,使它看起来不那么亮,而且图像的保存方式有问题,剥离了 alpha 信息,因此明显增加了亮度。

所以,我用我知道没有任何技巧的另一张图片尝试了您的代码,但您的代码似乎仍然没有执行任何操作。事实证明,您从 myImage.getRGB(); returns 获得的 int 值的 ARGB 格式为 "A" 255,这意味着您需要检查 0xFFFFFFFF,而不是 0x00FFFFFF。

当然,当您替换一个值时,您必须将其替换为 0xFF0000FF,指定一个完整的 alpha 值。将像素替换为 0x000000FF 没有可见效果,因为无论蓝色值高,alpha 为零,因此像素将呈现透明。