2012-06-18 22 views
14

Also mache ich eine Anwendung, um Verknüpfungen zu allen Lieblingsanwendungen des Benutzers zu speichern, die quasi wie ein Hub wirken. Ich kann Unterstützung für tatsächliche Dateien haben und ich habe einen .lnk Parser für Verknüpfungen. Ich dachte, es wäre gut, wenn die Anwendung auch Internet-Shortcuts unterstützt. Dies ist, was ich tue:Wie bekomme ich favicon.ico von einer Website mit Java?

Angenommen, ich versuche, Google's icon (http://www.google.com/favicon.ico) zu bekommen.

  1. ich beginnen, indem der Extraseiten loszuwerden (zB www.google.com/anotherpage würde www.google.com werden.

  2. Dann habe ich ImageIO.read(java.net.URL), um das Bild zu bekommen.

Das Problem ist, dass ImageIO gibt nie ein Bild zurück, wenn ich diese Methode aufrufen:

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; 

Jetzt habe ich zwei Fragen:

  1. Does Java unterstützt das ICO-Format, obwohl es von Microsoft ist?
  2. Warum kann ImageIO nicht von der URL gelesen werden?

Vielen Dank im Voraus!

+0

[Wenn kein registrierter ImageReader den resultierenden Stream lesen kann, wird null zurückgegeben.] (Http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html) –

+0

@HunterMcMillen Nein, kannst du das ein bisschen erklären? – mattbdean

+0

Sind Sie sicher, dass 'getBaseURL()' auch den letzten String entfernt? Wenn nicht, versuchen Sie, das Bild von www.google.com//favicon.ico zu erhalten. – 11684

Antwort

10

Versuchen Sie Image4J.

Wie diese schnelle Session zeigt Scala REPL (pasten können als Java-Code):

> 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

Ihre Fragen zu beantworten: Ist die Java-Unterstützung ICO? Nicht, wie es scheint:

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

java.lang.IllegalArgumentException: Empty region! 

Warum ImageIO nicht aus der URL lesen? Nun, die URL selbst scheint für mich zu funktionieren, so dass Sie möglicherweise ein Proxy/Firewall Problem haben, oder es könnte das Problem oben sein.

+0

Danke! Diese Bibliothek ist wirklich gut! – mattbdean

+0

Es ist ein Vergnügen :) – opyate

+0

@opyate Es ist ein [Bug] (http://bugs.sun.com/view_bug.do;jsessionid=cf757a2e4d6ffffffff9113c0c3c674747?bug_id=6633448) in Java. Die ImageIO-Klasse versucht, "WBMPImageReader" als ico-Parser zu verwenden, schlägt jedoch fehl. Das Problem ist mit einigen anderen Formaten dokumentiert (z. B. .mov). Laut dem Fehlerbericht ist das Problem seit 7 (b63) behoben. Die Problemumgehung bestand darin, 'WBMPImageReader' zu deaktivieren. – user845279

3

Dafür benötigen Sie ImageIO nicht. Kopieren Sie einfach die Bytes wie bei jeder anderen statischen Ressource.

4

Alte Post, aber für die Zukunft:

ich ein Plugin für ImageIO geschrieben haben, die Unterstützung für ICO (MS Windows-Symbol) und .CUR (MS Windows Cursor) Formate ergänzt.

Sie können es von GitHub bekommen hier: https://github.com/haraldk/TwelveMonkeys/

Nachdem Sie installed das Plugin haben, sollten Sie in der Lage sein, das Symbol zu lesen, ohne Änderungen des Codes in der ursprünglichen Nachricht verwendet wird.

+0

Ihre Bibliothek ist erstaunlich, ich fand es heute wow! – GOXR3PLUS