在Java中检查图像是全白还是完全透明

时间:2015-07-05 08:20:45

标签: java image

我正在调用一个网址来在本地获取图片存储并且它已经正常工作,但我只是想确定图像是全白还是完全透明,以便我可以跳过图像。

URL url = new URL(logoUrl);
InputStream is = url.openStream();
String fileName = logoUrl.substring(logoUrl.lastIndexOf('/') + 1);
//call other service to upload image as byte array.
uploadService.writeFile(request, fileName, IOUtils.toByteArray(is));

1 个答案:

答案 0 :(得分:1)

您必须检查所有像素,以检查图像是全白还是全透明。使用PixelGrabber获取所有像素。如果找到任何非完全透明或非白色像素,则图像有效。这是代码:

public static boolean isValid(String imageUrl) throws IOException, InterruptedException {
    URL url = new URL(imageUrl);
    Image img = ImageIO.read(url);
    //img = img.getScaledInstance(100, -1, Image.SCALE_FAST);
    int w = img.getWidth(null);
    int h = img.getHeight(null);
    int[] pixels = new int[w * h];
    PixelGrabber pg = new PixelGrabber(img, 0, 0, w, h, pixels, 0, w);
    pg.grabPixels();
    boolean isValid = false;
    for (int pixel : pixels) {
        Color color = new Color(pixel);
        if (color.getAlpha() == 0 || color.getRGB() != Color.WHITE.getRGB()) {
            isValid = true;
            break;
        }
    }
    return isValid;
}

您应该调整图像大小以解决性能问题,这样您就不会遍历所有像素:

img = img.getScaledInstance(300, -1, Image.SCALE_FAST);

注意:调整大小可能会错过可能包含白色以外颜色的小区域。因此失败了这个算法。但它很少会发生

编辑:
以下是以下图像的测试运行:

  1. 带有网址http://i.stack.imgur.com/GqRSB.png的白色图片:
    enter image description here
    System.out.println(isValid("http://i.stack.imgur.com/GqRSB.png"));
    输出:false

  2. 带网址http://i.stack.imgur.com/n8Wfi.png的透明图片:
    enter image description here
    System.out.println(isValid("http://i.stack.imgur.com/n8Wfi.png"));
    输出:false

  3. 包含网址http://i.stack.imgur.com/Leusd.png的有效图片:
    enter image description here
    System.out.println(isValid("http://i.stack.imgur.com/Leusd.png"));
    输出:true