如何从使用Java的网站获取favicon.ico?

时间:2012-06-18 20:25:27

标签: java image javax.imageio ico

所以我正在创建一个应用程序来存储所有用户最喜欢的应用程序的快捷方式,就像一个集线器。我可以支持实际文件,我有一个.lnk解析器用于快捷方式。我认为应用程序支持Internet快捷方式也是相当不错的。这就是我正在做的事情:

假设我正试图获得Google's iconhttp://www.google.com/favicon.ico)。

  1. 我首先删除额外的网页(例如www.google.com/anotherpage将成为www.google.com

  2. 然后,我使用ImageIO.read(java.net.URL)来获取图片。

  3. 问题在于,当我调用此方法时,ImageIO永远不会返回Image:

    String trimmed = getBaseURL(page); //This removes the extra pages
    Image icon = null;    
    try {
        String fullURLString = trimmed + "/favicon.ico";
        URL faviconURL = new URL(fullURLString);
        icon = ImageIO.read(faviconURL);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    return icon;
    

    现在我有两个问题:

    1. Java是否支持ICO格式,即使它来自Microsoft?
    2. 为什么ImageIO无法从网址读取?
    3. 提前谢谢!

4 个答案:

答案 0 :(得分:10)

尝试Image4J

这个快速的Scala REPL会话显示(可以粘贴为Java代码):

> net.sf.image4j.codec.ico.ICODecoder.read(new java.net.URL("http://www.google.com/favicon.ico").openStream())

res1: java.util.List[java.awt.image.BufferedImage] = [BufferedImage@65712a80: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 16 height = 16 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0]

<强>更新

回答您的问题:Java是否支持ICO?看起来不像:

> javax.imageio.ImageIO.read(new java.net.URL("http://www.google.com/favicon.ico"))

java.lang.IllegalArgumentException: Empty region!

为什么ImageIO无法从网址读取?嗯,URL本身似乎对我有用,所以你可能有代理/防火墙问题,或者它可能是上面的问题。

答案 1 :(得分:5)

旧帖子,但供将来参考:

我为ImageIO编写了一个插件,增加了对.ICO(MS Windows Icon)和.CUR(MS Windows Cursor)格式的支持。

你可以在这里从GitHub获取它:https://github.com/haraldk/TwelveMonkeys/

在您拥有installed插件后,您应该能够使用原始帖子中的代码阅读图标,而无需进行任何修改。

答案 2 :(得分:3)

您不需要ImageIO。只需复制字节,与任何其他静态资源相同。

答案 3 :(得分:0)

有用于读取ico文件和其他文件的Apache Commons Imaging:https://commons.apache.org/proper/commons-imaging/index.html

读取ico文件的过程如下:

List<BufferedImage> images = org.apache.commons.imaging.Imaging.getAllBufferedImages(yourIcoFile);

我想,您必须先下载它。