我正在调用一个网址来在本地获取图片存储并且它已经正常工作,但我只是想确定图像是全白还是完全透明,以便我可以跳过图像。
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));
答案 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);
注意:调整大小可能会错过可能包含白色以外颜色的小区域。因此失败了这个算法。但它很少会发生
编辑:
以下是以下图像的测试运行:
带有网址http://i.stack.imgur.com/GqRSB.png的白色图片:
System.out.println(isValid("http://i.stack.imgur.com/GqRSB.png"));
输出:false
带网址http://i.stack.imgur.com/n8Wfi.png的透明图片:
System.out.println(isValid("http://i.stack.imgur.com/n8Wfi.png"));
输出:false
包含网址http://i.stack.imgur.com/Leusd.png的有效图片:
System.out.println(isValid("http://i.stack.imgur.com/Leusd.png"));
输出:true