2013-09-07 6 views
5

Ich arbeite an Android und versuche, ein Favicon (.ICO) von einer Website auf einem ImageView herunterzuladen und anzuzeigen.Gibt es eine Möglichkeit, eine .ICO-Datei auf eine Auflösung größer als 16x16 zu dekodieren?

Bis jetzt habe ich es geschafft, die .ico von einer Website mit einer HTTP-Verbindung zu lesen, es als InputStream abrufen. Dann verwende ich eine BitmapFactory, um den Stream in eine Bitmap zu decodieren und auf dem ImageView anzuzeigen. Hier ist der Code:

public Bitmap getBitmapFromURL(URL src) {   
     try { 

      URL url = new URL("http", "www.google.com", "/favicon.ico"); 

      HttpURLConnection connection = (HttpURLConnection) url.openConnection();     

      connection.setDoInput(true);  

      connection.connect();    

      InputStream input = connection.getInputStream();  

      BitmapFactory.Options options = new BitmapFactory.Options(); 

      Bitmap myBitmap = BitmapFactory.decodeStream(input, null, options); 

      return myBitmap; 

     } catch (IOException e) {    
      e.printStackTrace();     
      return null;     
     } 
    } 

Das Problem ist, dass die Decodierung der input gibt immer einen kleinen 16x16 Bitmap. Wenn ich gut verstanden habe, kann eine einzelne .ICO-Datei unterschiedliche Bildauflösungen wie 32x32 und 64x64 speichern. Meine Frage ist, gibt es eine Möglichkeit, die 32x32 oder 64x64 Bitmap anstelle von 16x16 zu dekodieren?

Wenn es keine Lösung mit BitmapFactory gibt, gibt es dafür einen Bibliotheks- oder Java-Code?

HINWEIS: Ich möchte die Bitmap nicht verkleinern, ich möchte eine 32x32 (oder größere) Auflösung, ohne die Bildqualität durch Strecken zu verlieren.

Vielen Dank im Voraus.

+0

Vielleicht enthält diese spezifische .ico nur eine 16x16-Version? –

+0

Ich denke nicht, wenn Sie in Ihrem Browser www.google.com/favicon.ico eingeben, wird Ihnen ein 32x32-Bild angezeigt. Wenn ich etwas nicht vermisse, zeigt es, dass mindestens ein 32x32 Bild in der Datei kodiert ist. Die BitmapFactory ist entweder, aus irgendeinem Grund, die 32x32-Version herunterzuskalieren, oder es gibt eine andere Version, eine 16x16, die ebenfalls in der Datei kodiert ist und die BitmapFactory wählt, um diese zu entschlüsseln. –

+0

@DavidNeto Ich wusste nicht, dass Sie auf diese Weise eine Ico-Datei lesen und dekodieren können. Kannst du das 16x16-Bild, das du bekommst, tatsächlich anzeigen? – quinestor

Antwort

1

Die Favicon-Datei kann mehrere Symbole enthalten, normalerweise eins in 16x16 und eins in 32x32. Dies wird im folgenden Thread diskutiert: How to have multiple favicon sizes, yet serve only a 16x16 by default?

Es ist der Fall mit dem Favico von Google. Wenn Sie versuchen, die Datei www.google.com/favicon.ico herunterladen und öffnen Sie es mit einer Anwendung wie IrfanView, können Sie sehen, dass es zwei Symbole (16x16 und 32x32) sind.

Um Ihre Frage zu beantworten, sollten Sie eine geeignete Bibliothek verwenden, um mehrere Symbole zu extrahieren, wie image4j, und wählen Sie die, die Sie benötigen.

http://image4j.sourceforge.net/

+1

Danke für Ihre Antwort. Leider funktioniert die Bibliothek nicht in Android.Anscheinend verwendet es einige Klassen, zum Beispiel BufferedImage, das zu der Java-Bibliothek java.awt.image gehört, die auf Android nicht existiert. Nach dem, was ich verstanden habe, soll diese Bibliothek die Grafikhandhabung steuern, und Android tut es auf eine andere Art und Weise. –

+0

Sie haben Recht, Sie benötigen eine ähnliche Bibliothek für Android, und ich weiß nicht, ob es eine gibt. Vielleicht werfen Sie einen Blick auf diese Frage: [Kann BitmapFactory.decodeFile .ICO (Windows-Icons) Dateien behandeln?] (Http://Stackoverflow.com/a/2690923/2482928), die erwähnt, dass es eine Android-Quelle für ICO Parsing gibt . Sie könnten das verwenden, um Ihr Favicon zu analysieren. – Thire

2

Ich weiß, dass die Frage vor 3 Jahren gefragt wurde, aber ich habe das gleiche Problem und angepasst, um einen Teil der image4j in ico4a konfrontiert, die Sie hier finden: https://github.com/divStar/ico4a (ich habe es selbst geschrieben, weil ich wollte das größte Bild aus einem Favicon laden, da image4j AWT-Klassen verwendet, die für Android nicht so leicht verfügbar sind, habe ich es so gemacht, dass ico4a hauptsächlich native Android-Klassen verwendet.

Es kann die meisten gültigen ICO-Dateien in eine Liste von Bitmap-Objekten decodieren. Ich glaube, entweder die Bibliothek selbst oder die Beispielanwendung hat auch eine Methode, um das größte Bitmap-Objekt abzurufen.

Meine Bibliothek ist jedoch nicht in der Lage, ICO-Dateien zu schreiben; es kann sie nur lesen. Sie können die einzelnen Bilder einfach als PNG- oder JPEG-Grafiken speichern, obwohl Sie einige integrierte Android-Funktionen verwenden.

Verwandte Themen