【问题标题】:Detect Empty Pixel From File从文件中检测空像素
【发布时间】:2018-11-19 14:14:05
【问题描述】:

在此处查看完整的项目检查 repo。随意克隆和运行。注意测试图像 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. 我怎样才能将其写入带有缓冲图像的图像文件。

  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);

【问题讨论】:

  • "程序中的红色值是 [0,0,0,255]" - 我假设您的意思是 [255,0,0,255]
  • "如果像素完全为空,我如何检查 java"-您基本上自己回答了这个问题:"我希望空位具有 Alpha 0"-您只需要从文件并检查其值。 getRGB() 方法对您没有帮助,因此请查看 getAlphaRaster() 等 - 通常情况下,JavaDoc 和互联网上的许多教程都是您的朋友(关于如何将该图像写入文件也)。
  • 对不起,我的意思是阅读。我会看看 getAlphaRaster() 谢谢。我已经写了一个文件,但添加以防在处理 alpha 时有特殊方式
  • @Thomas 我试过了,但似乎没有帮助。它所做的唯一一件事就是使所有像素的 alpha 值为 0 而不是 255 WritableRaster imageRaster = buffImage.getAlphaRaster();整数 [] 像素 = 新整数 [4];整数阿尔法 = 0; for (int i = 0; i
  • 嗯,您在评论中发布的代码很难阅读以发现错误并不容易。假设没有,这可能与读取图像时指定的颜色/像素格式有关。根据文档,默认格式为 ARGB,因此 alpha 通道应位于索引 0。

标签: java image-processing alpha is-empty


【解决方案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 光栅(并非所有 BufferedImages 都有一个)来实现这一点,避免它更简单且更兼容。

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

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

【讨论】:

    【解决方案2】:

    这是一个有效的例子,你也可以在我的 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多