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

mat*_*ean 16 java image ico javax.imageio

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

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

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

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

问题是,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;
Run Code Online (Sandbox Code Playgroud)

现在我有两个问题:

  1. Java是否支持ICO格式,即使它来自Microsoft?
  2. 为什么ImageIO无法从URL读取?

先感谢您!

opy*_*ate 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]
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

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

java.lang.IllegalArgumentException: Empty region!
Run Code Online (Sandbox Code Playgroud)

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


har*_*ldK 5

旧帖子,但供将来参考:

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

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

你以后安装该插件后,你应该能够读取该图标,使用原来的职位代码无需做任何修改.