【问题标题】:Check if an image is all white or fully transparent in Java检查图像在 Java 中是全白还是全透明
【发布时间】:2015-07-05 08:20:45
【问题描述】:

我正在调用一个 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));

【问题讨论】:

  • 嘿伙计,当我检查它是否完全透明时,全白色呢?
  • 你循环抛出像素并检查颜色,如果你发现所有颜色不是白色然后返回
  • 链接的“检查透明度”仅确定是否存在 Alpha 通道。可能没有 Alpha 通道,但仍然是全白的;或者可能有一个始终完全不透明的 Alpha 通道。这两种情况都未能通过“全白或完全[透明]”的检查。

标签: java image


【解决方案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. 带有 url http://i.stack.imgur.com/GqRSB.png 的白色图像:

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

  2. 带有 url http://i.stack.imgur.com/n8Wfi.png 的透明图片:

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

  3. 有效图片,网址为http://i.stack.imgur.com/Leusd.png

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

【讨论】:

  • 感谢@afzalex,我们现在试试
  • 我调用了一个 url 来获取如下代码的图像,并使用你的函数,但它总是返回无效的 URL url = new URL("us.farrow-ball.com/pws/client/images/catalogue/products/102005/…); Image img = ImageIO.read(url) ;
  • 我在代码中使用了Image img = null。这绝对是无效的。我没有任何图像可以试验。您应该在此处提供您的图像。像这样:Image img = ImageIO.read(url)
  • 是的,我使用的和你的代码一样,这里是白色的图片网址:us.farrow-ball.com/pws/client/images/catalogue/products/102005/…
  • 朋友,此网址不指向任何图片。它只是输出文本,但没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多