Как получить favicon.ico с веб-сайта с помощью Java?

Итак, я создаю приложение для хранения ярлыков во всех любимых приложениях для пользователей, которые действуют как хаб. Я могу поддерживать фактические файлы, и у меня есть парсер .lnk для ярлыков. Я подумал, что приложение также будет очень полезно поддерживать ярлыки Интернета. Это то, что я делаю:

Предположим, я пытаюсь получить значок Google (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;

Теперь у меня есть два вопроса:

  • Поддерживает ли Java формат ICO, даже если он принадлежит Microsoft?
  • Почему ImageIO не удается прочитать URL-адрес?

Заранее благодарю вас!

Ответы

Ответ 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] = [[email protected]: 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-адрес работает для меня, поэтому у вас может быть проблема с прокси-сервером или брандмауэром, или это может быть проблема выше.

Ответ 2

Старый пост, но для справок в будущем:

Я написал плагин для ImageIO, который добавляет поддержку значков .ICO(MS Windows Icon) и .CUR(MS Windows Cursor).

Вы можете получить его от GitHub здесь: https://github.com/haraldk/TwelveMonkeys/

После того, как вы установили плагин, вы сможете прочитать значок, используя код в исходном сообщении без каких-либо изменений.

Ответ 3

Для этого вам не нужен ImageIO. Просто скопируйте байты так же, как и для любого другого статического ресурса.