Why use ImageIO can't get BufferedImage from URL

▼魔方 西西 提交于 2021-02-09 11:42:50

问题


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

or

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

the result image is null? why?


回答1:


ImageIO.read(URL) does support reading images from URL like you describe, however, it does support only a limited set of image formats. Built-in formats are JPEG, PNG, GIF, BMP and WBMP. There are plugins for many other formats, like TIFF, JPEG 2000, etc.

The problem is that the linked image is not in any of the built-in formats, it's in WEBP format, a new image format created by Google, and which does not have very widespread use yet. The reason it displays fine in your browser (and mine :-) ), is most likely that you are using Chrome, and Chrome has built-in support for WEBP.

There's at least one WEBP ImageIO plugin available. If you build and install this plugin, your code above should work and read the image just fine. There should be no need to invoke ImageIO.scanForPlugins() if the plugin is on class path when you launch your application.




回答2:


Make sure the URL your provided is linking to a valid image file format such as jpg, png, bmp and so on.

Your current URL is linking to a .php file which is obviously not an image.

For example:

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



回答3:


When I open the link in Firefox, it attempts to download a file called "safe_image.php". It works in Google Chrome, so there's something weird going on in the headers or something for that URL. Is there any way you can host the image elsewhere?

Edit: Your image appears to be in the WebP format. ImageIO does not support this format natively, so you will need a library like webp-imageio.

Install that library and see if your code works. ImageIO should automatically find the plugin when you run ImageIO.scanForPlugins().



来源:https://stackoverflow.com/questions/35884305/why-use-imageio-cant-get-bufferedimage-from-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!