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

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

假设我正在尝试获取Google的图标 ( http://www.google.com/favicon.ico )。

  1. 我开始删除额外的页面(例如www.google.com/anotherpage将成为www.google.com

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

问题是当我调用此方法时, 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无法从URL读取?

先感谢您!

试试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] 

UPDATE

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

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

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

旧post,但供将来参考:

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

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

安装插件后,您应该能够使用原始post中的代码阅读图标,而无需任何修改。

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