new - java image handling
¿Cómo obtener favicon.ico desde un sitio web utilizando Java? (3)
Antigua publicación, pero para futura referencia:
He escrito un complemento para ImageIO que agrega compatibilidad con los formatos .ICO (Icono de MS Windows) y .CUR (Cursor de MS Windows).
Puede obtenerlo en GitHub aquí: https://github.com/haraldk/TwelveMonkeys/
Una vez que hayas installed el complemento, deberías poder leer el ícono, usando el código en la publicación original sin ninguna modificación.
Así que estoy creando una aplicación para almacenar accesos directos a todas las aplicaciones favoritas del usuario, actuando como un concentrador. Puedo tener soporte para archivos reales y tengo un analizador .lnk
para accesos directos. Pensé que también sería bueno que la aplicación fuera compatible con los accesos directos de Internet. Esto es lo que estoy haciendo:
Supongamos que estoy tratando de obtener el ícono de Google ( http://www.google.com/favicon.ico
).
Comencé por deshacerme de las páginas adicionales (por ejemplo,
www.google.com/anotherpage
se convertiría enwww.google.com
.Luego, uso
ImageIO.read(java.net.URL)
para obtener la imagen.
El problema es que ImageIO
nunca devuelve una imagen cuando llamo a este método:
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;
Ahora tengo dos preguntas:
- ¿Admite Java el formato ICO aunque sea de Microsoft?
- ¿Por qué no puede leer
ImageIO
desde la URL?
¡Gracias de antemano!
No necesitas ImageIO para esto. Solo copie los bytes, igual que para cualquier otro recurso estático.
Pruebe Image4J .
Como muestra esta rápida sesión REPL de Scala (se puede pegar como código 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]
ACTUALIZAR
Para responder a sus preguntas: ¿Java es compatible con ICO? No lo parece:
> javax.imageio.ImageIO.read(new java.net.URL("http://www.google.com/favicon.ico"))
java.lang.IllegalArgumentException: Empty region!
¿Por qué no puede leer ImageIO
desde la URL? Bueno, la URL en sí parece funcionar para mí, por lo que puede tener un problema de proxy / firewall, o podría ser el problema anterior.