17

所以我正在制作一个应用程序来存储所有用户最喜欢的应用程序的快捷方式,就像一个集线器一样。我可以支持实际文件,并且我有一个.lnk用于快捷方式的解析器。我认为该应用程序也支持 Internet 快捷方式会非常好。这就是我正在做的事情:

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

  1. 我从删除多余的页面开始(例如www.google.com/anotherpage会变成www.google.com.

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

问题是ImageIO当我调用此方法时永远不会返回图像:

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 读取?

先感谢您!

4

4 回答 4

11

尝试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 读取?好吧,URL 本身似乎对我有用,因此您可能遇到代理/防火墙问题,或者可能是上述问题。

于 2012-06-18T21:53:33.217 回答
5

旧帖子,但供将来参考:

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

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

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

于 2013-12-23T15:22:46.167 回答
3

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

于 2013-12-02T02:20:41.680 回答
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);

在你的情况下,你必须先下载它,我猜。

于 2020-09-22T06:10:42.497 回答