2012-06-18 14 views
14

Así que estoy haciendo una aplicación para almacenar accesos directos a todas las aplicaciones favoritas del usuario, actuando como un centro. Puedo tener soporte para archivos reales y tengo un analizador .lnk para accesos directos. Pensé que sería bueno que la aplicación también admita accesos directos a Internet. Esto es lo que estoy haciendo:¿Cómo obtener favicon.ico desde un sitio web usando Java?

Supongamos que estoy tratando de obtener Google's icon (http://www.google.com/favicon.ico).

  1. comienzo a cabo mediante la eliminación de las páginas adicionales (por ejemplo www.google.com/anotherpage se convertiría en www.google.com.

  2. Entonces, yo 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:

  1. ¿El Java compatibles con el formato ICO a pesar de que es de Microsoft?
  2. ¿Por qué ImageIO no se puede leer desde la URL?

Gracias de antemano!

+0

[Si ningún ImageReader registrado afirma ser capaz de leer la secuencia resultante, se devuelve nulo.] (Http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html) –

+0

@HunterMcMillen No, ¿puedes explicar eso un poco? – mattbdean

+0

¿estás seguro de que 'getBaseURL()' elimina la última cadena también? De lo contrario, intenta obtener la imagen de www.google.com//favicon.ico. – 11684

Respuesta

10

Probar Image4J.

Como esta sesión rápida muestra Scala (repl pegar-poder 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] = [[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] 

ACTUALIZACIÓN

Para responder a sus preguntas: ¿El ICO soporte de Java? No parece como que:

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

java.lang.IllegalArgumentException: Empty region! 

¿Por qué fracasan ImageIO para leer 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.

+0

¡Gracias! Esa biblioteca es realmente buena! – mattbdean

+0

Es un placer :) – opyate

+0

@opyate Es un [error] (http://bugs.sun.com/view_bug.do;jsessionid=cf757a2e4d6ffffffff9113c0c3c674747?bug_id=6633448) en Java. La clase ImageIO intenta usar 'WBMPImageReader' como un analizador ico pero falla. El problema está documentado con un par de otros formatos (.mov, por ejemplo). Según el informe de error, el problema se soluciona a partir del 7 (b63). La solución fue desactivar 'WBMPImageReader'. – user845279

3

No necesita ImageIO para esto. Solo copie los bytes, igual que para cualquier otro recurso estático.

4

Mensaje viejo, pero para referencia futura:

He escrito un plugin para ImageIO que añade soporte para ICO (icono de MS Windows) y .CUR (MS Windows Cursor) formatos.

Puede obtenerlo de GitHub aquí: https://github.com/haraldk/TwelveMonkeys/

Después de tener installed el plugin, usted debe ser capaz de leer el icono, utilizando el código en el post original sin ninguna modificación.

+0

Su biblioteca es increíble, la encontré hoy ¡guau! – GOXR3PLUS

Cuestiones relacionadas