在Java中检查图像是否为全白色或完全透明

在Java中检查图像是否为全白色或完全透明,java,image,Java,Image,我调用了一个url来获取本地的图像存储,它已经在工作了,但是我只想确定图像是全白的还是完全透明的,这样我就可以跳过图像了 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. uploadS

我调用了一个url来获取本地的图像存储,它已经在工作了,但是我只想确定图像是全白的还是完全透明的,这样我就可以跳过图像了

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

您必须检查所有像素,以检查您的图像是全白色还是全透明。使用
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);
注意:调整大小可能会遗漏可能包含除白色以外颜色的小区域。因此,这个算法失败了。但这种情况很少发生

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

  • 带有url的白色图像:

    System.out.println(isValid(“http://i.stack.imgur.com/GqRSB.png"));
    输出:false

  • 带有url的透明图像:

    System.out.println(isValid(“http://i.stack.imgur.com/n8Wfi.png"));
    输出:false

  • url为的有效图像:

    System.out.println(isValid(“http://i.stack.imgur.com/Leusd.png"));
    输出:真


  • 嘿,伙计,当我检查它是否完全透明时,所有白色的颜色如何?你循环抛出像素并检查颜色如果你发现所有颜色都不是白色,那么返回链接的“检查透明度”仅确定是否存在alpha通道。可能没有阿尔法通道,但仍然是完全白色的;或者可能有一个alpha通道始终是完全不透明的。这两种情况都未通过“全白或完全[透明]”检查。谢谢@afzalex,现在让我们尝试一下。我已经调用了一个url来获取下面类似图像的代码,并使用了您的函数,但它总是返回无效的url url=new url(“);image img=ImageIO.read(url);我在代码中使用了
    Image img=null
    。这绝对是无效的。我没有任何图像可供实验。您应该在此处提供您的图像。如下所示:
    Image img=ImageIO.read(url)
    是的,我使用的代码与您的代码相同,这是白色图像url:朋友,此url不指向任何图像。它只输出文本,但不输出任何内容。