Как получить 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. Просто скопируйте байты так же, как и для любого другого статического ресурса.