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

Posted

技术标签:

【中文标题】如何从使用 Java 的网站获取 favicon.ico?【英文标题】:How to get favicon.ico from a website using Java? 【发布时间】:2012-06-20 20:59:59 【问题描述】:

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

假设我正在尝试获取Google's icon (http://www.google.com/favicon.ico)。

    我首先删除多余的页面(例如,www.google.com/anotherpage 将变为 www.google.com

    然后,我使用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;

现在我有两个问题:

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

提前谢谢你!

【问题讨论】:

If no registered ImageReader claims to be able to read the resulting stream, null is returned. @HunterMcMillen 不,你能解释一下吗? 你确定 'getBaseURL()' 也删除了最后一个字符串吗?如果没有,您正在尝试从 www.google.com//favicon.ico 获取图像。 @11684 是的,URL 的路径是http://www.google.com/favicon.ico @whowantsakookie 如果没有注册的图像阅读器可以读取该格式,您将返回 null。正如博试图链接到的页面中所述。链接:docs.oracle.com/javase/6/docs/api/javax/imageio/… 出于某种原因,我在他的链接上得到了 404 【参考方案1】:

试试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 本身似乎对我有用,所以您可能遇到代理/防火墙问题,或者可能是上述问题。

【讨论】:

@opyate 它是 Java 中的 bug。 ImageIO 类尝试使用 WBMPImageReader 作为 ico 解析器,但失败了。该问题以其他几种格式(例如 .mov)记录在案。根据错误报告,该问题已从 7(b63) 开始修复。解决方法是禁用WBMPImageReader 请注意,此处的代码并非在所有情况下都有效,因为 ICODecoder(0.7,2008 年发布但仍未更新)在如何从 InputStream 中读取时存在严重错误,而不是检查来自的返回值read() (或检查它,做错事。)使用 BufferedInputStream 可能 避免这种情况,但我不能确定 BufferedInputStream 的 read() 是否每次都会返回数据,所以我认为更好的做法是将整个图标读入一个字节[],然后给 ICODecoder 一个 ByteArrayInputStream。【参考方案2】:

旧帖,但供将来参考:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

读取 ico 文件的工作方式如下:

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

我猜你必须先下载它。

【讨论】:

以上是关于如何从使用 Java 的网站获取 favicon.ico?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 403 页面获取网站图标

从 WKWebView 获取 favicon.co

如何获取网站的logo

如何防止 favicon.ico 请求?

如何从URL获取'apple-touch-icon?

java 如何设置网站图标?