为什么使用ImageIO无法从URL获取BufferedImage

时间:2016-03-09 06:14:56

标签: java url bufferedimage javax.imageio

imageURL:https://fbexternal-a.akamaihd.net/safe_image.php?d=AQBB77GLfY75FNWL&w=720&h=2048&url=http%3A%2F%2Fwww.facebook.com%2Fads%2Fimage%2F%3Fd%3DAQI0duFYFcmydWNutbwmSk2DfOmHcDrhPfsMJTUoEObbWkVzYUtrHgCuN_LFrWcPRzJi6jPgbn80oFs0Kj_WrdROjdnJkjbnS5-UJv9l9cJyhKCWS-lr-MXlc263Ul3Txe-VFqXfRrA6BOjt4DF-Sww2&ext=best

URL url = new URL(imageURL);
BufferedImage image = ImageIO.read(url);

URL url = new URL(imageURL);
BufferedImage image = ImageIO.read(url.openStream());

结果图片为空?为什么呢?

3 个答案:

答案 0 :(得分:4)

ImageIO.read(URL)确实支持从您描述的URL中读取图像,但是,它仅支持一组有限的图像格式。内置格式为JPEG,PNG,GIF,BMP和WBMP。有许多其他格式的插件,如TIFF,JPEG 2000等。

问题在于链接的图片不是任何内置格式,而是WEBP format,这是Google创建的一种新图片格式,目前还没有广泛使用。它在您的浏览器(以及我的:-))中显示正常的原因很可能是您使用Chrome,而Chrome内置了对WEBP的支持。

至少有一个WEBP ImageIO plugin可用。如果您构建并安装此插件,上面的代码应该可以正常工作并读取图像。如果插件在启动应用程序时位于类路径上,则无需调用ImageIO.scanForPlugins()

答案 1 :(得分:1)

确保您提供的网址链接到有效的图片文件格式,例如jpgpngbmp等。

您当前的网址链接到.php文件,该文件显然不是图片。

例如:

enter image description here

public static void main(String[] args)
{     
    Image image = null;
    try {
        URL url = new URL("https://s-media-cache-ak0.pinimg.com/236x/ac/bb/d4/acbbd49b22b8c556979418f6618a35fd.jpg");
        image = ImageIO.read(url);
    } catch (IOException e) {
        e.printStackTrace();
    }

    JFrame frame = new JFrame();
    frame.setSize(236, 306);
    frame.add(new JLabel(new ImageIcon(image)));
    frame.setVisible(true);                 
}

答案 2 :(得分:0)

当我在Firefox中打开链接时,它会尝试下载名为“safe_image.php”的文件。它适用于谷歌浏览器,因此标题或该URL的内容有些奇怪。你有什么方法可以将图像托管在其他地方吗?

修改:您的图片显示为WebP格式。 ImageIO本身不支持此格式,因此您需要一个类似webp-imageio的库。

安装该库并查看您的代码是否有效。运行ImageIO时,ImageIO.scanForPlugins()会自动找到该插件。