Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get favicon.ico from a website using Java?

So I'm making an application to store shortcuts to all the user's favorite applications, acting kind of like a hub. I can have support for actual files and I have a .lnk parser for shortcuts. I thought it would be pretty good for the application to support Internet shortcuts, too. This is what I'm doing:

Suppose I'm trying to get Google's icon (http://www.google.com/favicon.ico).

  1. I start out by getting rid of the extra pages (e.g. www.google.com/anotherpage would become www.google.com.

  2. Then, I use ImageIO.read(java.net.URL) to get the Image.

The problem is that ImageIO never returns an Image when I call this method:

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;

Now I have two questions:

  1. Does Java support the ICO format even though it is from Microsoft?
  2. Why does ImageIO fail to read from the URL?

Thank you in advance!

like image 887
mattbdean Avatar asked Jun 18 '12 20:06

mattbdean


1 Answers

Try Image4J.

As this quick Scala REPL session shows (paste-able as Java code):

> 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

To answer your questions: Does Java support ICO? Doesn't seem like it:

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

java.lang.IllegalArgumentException: Empty region!

Why does ImageIO fail to read from the URL? Well, the URL itself seems to work for me, so you may have a proxy/firewall issue, or it could be the problem above.

like image 85
opyate Avatar answered Sep 21 '22 15:09

opyate