从文件中检测空像素

时间:2018-11-19 14:14:06

标签: java image-processing alpha is-empty

有关完整的项目检查存储库,请点击此处。随时克隆并运行。注意测试图像 https://github.com/AshGale/Image2RGBA

当在GIMP中读取具有显示为空(哈希)部分的PNG时,读入程序的值为[0,0,0,255](红色,绿色,蓝色,Alpha)。我期望空位具有Alpha 0,因此完全为空[0,0,0,0]。但是,值是[0,0,0,255]也是全黑的。

  1. 问题,如何在java中检查像素是否完全为空,即在gimp中散列。

  2. 然后我如何将其写入带有bufferedImage的图像文件中。

  3. 对于图像为空的图像,alpha值应该为0吗?请建议以文件或文件格式读取的方式。

    //代码提取有关完整代码,请参见Git

...

for (int i = 0; i < imageHeight; i++) {
    for (int j = 0; j < imageWidth; j++) {

    individualPixel = new Color(buffImage.getRGB(j, i));

    //TODO find a way to detect a empty pixel an keep perfect black
    if(individualPixel.getRed() == 0 
            && individualPixel.getGreen() == 0
            && individualPixel.getBlue() ==0
            ) {                             

        //set pixel at location to empty
        buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
    }else {
        // RED
        tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
        buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));

        // GREEN

        // BLUE
    }

...

ImageIO.write(buffRed, "png", redImg);

enter image description here

2 个答案:

答案 0 :(得分:1)

我相信您原始代码中的问题仅是这一行:

individualPixel = new Color(buffImage.getRGB(j, i));

Color构造函数有效地丢弃了alpha分量。 JavaDoc说(重点是我):

  

使用指定的组合RGB值创建不透明 sRGB颜色[...] Alpha默认为255。

应该是:

individualPixel = new Color(buffImage.getRGB(j, i), true); // hasAlpha = true

此构造函数JavaDoc说:

  

使用指定的RGBA组合值创建一个sRGB颜色[...]如果hasalpha参数为false,则alpha默认为255。

您不必真正使用alpha栅格(并非所有BufferedImage都具有一个栅格)来实现此目的,并且避免它既简单又兼容。

最后,完全透明像素的R,G和B值并不重要。因此,测试是否全黑可能是一个过于严格的检查(尽管对于您的输入图像来说似乎确实可以正常工作)。

PS:我认为更精确的术语是“透明”,而不是“空”。

答案 1 :(得分:0)

这是可行的示例,您也可以在有问题的github上查看完整的示例。 感谢托马斯(Thomas)反对使用getAlphaRaster()

// get RGB from image
BufferedImage buffImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

try {
    buffImage = ImageIO.read(imageFile);
} catch (IOException e) {
}

int imageHeight = buffImage.getHeight();
int imageWidth = buffImage.getWidth();
Color individualPixel = null;
Color tempPixel = null;

BufferedImage buffRed = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffGreen = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffBlue = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);

WritableRaster imageRaster = buffImage.getAlphaRaster();
int[] pixel = new int[4];
int alpha = 0;

for (int i = 0; i < imageHeight; i++) {
    for (int j = 0; j < imageWidth; j++) {

        individualPixel = new Color(buffImage.getRGB(j, i));

        imageRaster.getPixel(j, i, pixel);
        alpha = pixel[0];//return 0 for empty

        //if(individualPixel.getAlpha() <255 || alpha >0)
            System.out.println(j + "," + i + " : " + individualPixel.getAlpha()+ "-"+alpha+ " =>" +
                    pixel[0] + " " + pixel[1] + " " + pixel[2] + " " + pixel[3]);

        //TODO find a way to detect a empty pixel an keep perfect black
        if(individualPixel.getRed() == 0 
                && individualPixel.getGreen() == 0
                && individualPixel.getBlue() ==0
                & alpha == 0) {                             

            //set pixel at location to empty
            buffRed.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
            buffGreen.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
            buffBlue.setRGB(j, i, getIntFromColor(0, 0, 0, 0));
        }else {
            // RED
            tempPixel = new Color(individualPixel.getRed(), 0, 0, individualPixel.getAlpha());
            buffRed.setRGB(j, i, getIntFromColor(tempPixel.getRed(), 0, 0, tempPixel.getAlpha()));

            // GREEN
            tempPixel = new Color(0, individualPixel.getGreen(), 0, individualPixel.getAlpha());
            buffGreen.setRGB(j, i, getIntFromColor(0, tempPixel.getGreen(), 0, tempPixel.getAlpha()));

            // BLUE
            tempPixel = new Color(0, 0, individualPixel.getBlue(), individualPixel.getAlpha());
            buffBlue.setRGB(j, i, getIntFromColor(0, 0, tempPixel.getBlue(), tempPixel.getAlpha()));
        }
    }   
    System.out.println("");                 
}

// Save Images to path of selected file
try {
    ImageIO.write(buffRed, "png", redImg);
    ImageIO.write(buffGreen, "png", greenImg);
    ImageIO.write(buffBlue, "png", blueImg);
} catch (IOException e) {

    JOptionPane.showMessageDialog(null, "Failed to create RGB files");
    e.printStackTrace();
}