2012-06-18 19 views
14

Quindi sto creando un'applicazione per archiviare i collegamenti a tutte le applicazioni preferite dell'utente, comportandosi come un hub. Posso avere il supporto per i file reali e ho un parser .lnk per le scorciatoie. Ho pensato che sarebbe stato abbastanza buono per l'applicazione supportare anche le scorciatoie di Internet. Questo è quello che sto facendo:Come ottenere favicon.ico da un sito Web utilizzando Java?

Supponiamo che sto cercando di ottenere Google's icon (http://www.google.com/favicon.ico).

  1. comincio da sbarazzarsi delle pagine in più (ad esempio www.google.com/anotherpage sarebbe diventato www.google.com.

  2. Poi, io uso ImageIO.read(java.net.URL) per ottenere l'immagine.

Il problema è che ImageIO non restituisce mai un'immagine quando chiamo questo metodo:

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; 

Ora ho due domande:

  1. fa Java supporta il formato ICO, anche se è da Microsoft?
  2. Perché ImageIO non riesce a leggere dall'URL?

Grazie in anticipo!

+0

[Se nessun ImageReader registrato dichiara di essere in grado di leggere il flusso risultante, viene restituito un valore nullo.] (Http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html) –

+0

@HunterMcMillen No, puoi spiegarlo un po '? – mattbdean

+0

sei sicuro che 'getBaseURL()' rimuova anche l'ultima stringa? In caso contrario, stai cercando di ottenere l'immagine da www.google.com//favicon.ico. – 11684

risposta

10

Prova Image4J.

quanto questo veloce mostra sessione Scala REPL (pasta-grado come codice 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

Per rispondere alle vostre domande: supporto Java ICO? Non sembra simile al primo:

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

java.lang.IllegalArgumentException: Empty region! 

Perché ImageIO non riescono a leggere dal URL? Bene, l'URL stesso sembra funzionare per me, quindi potresti avere un problema con il proxy/firewall, oppure potrebbe essere il problema sopra riportato.

+0

Grazie! Quella libreria è davvero buona! – mattbdean

+0

È un piacere :) – opyate

+0

@opyate È un [bug] (http://bugs.sun.com/view_bug.do;jsessionid=cf757a2e4d6ffffffff9113c0c3c674747?bug_id=6633448) in Java. La classe ImageIO tenta di usare 'WBMPImageReader' come un parser ico ma fallisce. Il problema è documentato con un paio di altri formati (.mov per esempio). Secondo la segnalazione di bug, il problema è risolto a partire da 7 (b63). La soluzione alternativa era disabilitare 'WBMPImageReader'. – user845279

3

Non è necessario ImageIO per questo. Basta copiare i byte, come per qualsiasi altra risorsa statica.

4

Vecchio post, ma per riferimento futuro:

ho scritto un plugin per ImageIO che aggiunge il supporto per ICO (MS Windows Icon) e .CUR (MS Windows Cursore) formati.

Si può ottenere da GitHub qui: https://github.com/haraldk/TwelveMonkeys/

Dopo aver installed il plugin, si dovrebbe essere in grado di leggere l'icona, utilizzando il codice nel post originale senza alcuna modifica.

+0

La tua biblioteca è incredibile, l'ho trovata oggi Eeeek !!! – GOXR3PLUS