2013-09-07 6 views
5

Sto lavorando su Android e sto cercando di scaricare e visualizzare una favicon (.ICO) da un sito Web su un ImageView.C'è un modo per decodificare un file .ICO ad una risoluzione maggiore di 16x16?

Finora sono riuscito a leggere il file .ico da un sito Web utilizzando una connessione HTTP, recuperarlo come InputStream. Quindi uso un BitmapFactory per decodificare il flusso in un Bitmap e visualizzarlo su ImageView. Ecco il codice:

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;     
     } 
    } 

Il problema è che la decodifica del inputStream restituisce sempre una piccola bitmap 16x16. Se ho ben capito, un singolo file .ICO può memorizzare diverse risoluzioni di immagine, come 32x32 e 64x64. La mia domanda è, c'è un modo per decodificare il 32x32 o il 64x64 Bitmap invece del 16x16?

Inoltre, se non esiste una soluzione con BitmapFactory, esiste una libreria o un codice java per fare ciò?

NOTA: Non voglio ridimensionare il bitmap, voglio un 32x32 (o più grande) risoluzione senza perdere la qualità dell'immagine da stretching.

Grazie in anticipo.

+0

Forse questo specifico .ico contiene solo una versione 16x16? –

+0

Non penso, se digiti www.google.com/favicon.ico sul tuo browser ti presenta un'immagine 32x32. A meno che non manchi qualcosa, mostra che almeno un'immagine 32x32 è codificata nel file. BitmapFactory è o, per qualche ragione, ridimensionamento della versione 32x32, o c'è un'altra versione, un 16x16 anche codificato nel file e BitmapFactory sta scegliendo di decodificarlo. –

+0

@DavidNeto Non sapevo che si potesse leggere e decodificare un file Ico in questo modo. Puoi visualizzare effettivamente l'immagine 16x16 che ottieni? – quinestor

risposta

1

Il file favicon può contenere più icone, di solito una in 16x16 e una in 32x32. Questo è discusso nel thread seguente: How to have multiple favicon sizes, yet serve only a 16x16 by default?

È il caso con il favico di Google. Se si tenta di scaricare il file www.google.com/favicon.ico e aprirlo con un'applicazione come IrfanView, è possibile vedere che ci sono due icone (16x16 e 32x32).

Per rispondere alla tua domanda, dovresti utilizzare una libreria appropriata per estrarre più icone, come image4j, e scegliere quella che ti serve.

http://image4j.sourceforge.net/

+1

Grazie per la risposta. Sfortunatamente, la libreria non funziona in Android.Apparentemente utilizza alcune classi, ad esempio BufferedImage, che appartiene alla libreria java java.awt.image, che non esiste su Android. Da quello che ho capito, questa libreria dovrebbe controllare la gestione della grafica, e Android lo fa in un modo diverso. –

+0

Hai ragione, hai bisogno di una libreria simile per Android, e non so se ce n'è uno. Magari dai un'occhiata a questa domanda: [Può BitmapFactory.decodeFile gestire file .ICO (icone Windows)?] (Http://stackoverflow.com/a/2690923/2482928), che menziona l'esistenza di una fonte Android per l'analisi ICO . Potresti usarlo per analizzare la tua favicon. – Thire

2

So che la domanda è stato chiesto 3 anni fa, ma ho affrontato lo stesso problema e adattato una porzione di image4j in ico4a, che potete trovare qui: https://github.com/divStar/ico4a (ho scritto io stesso perché io volevo caricare l'immagine più grande da una favicon, poiché image4j utilizza le classi AWT, che non sono facilmente disponibili per Android, l'ho fatto in modo che ico4a utilizzi principalmente le classi native di Android).

È in grado di decodificare i file ICO più validi in un elenco di oggetti Bitmap. Credo che la libreria stessa o l'applicazione di esempio abbia anche un metodo per recuperare il più grande oggetto Bitmap.

Tuttavia, la mia libreria non è in grado di scrivere file ICO; può solo leggerli. È possibile salvare facilmente le singole immagini come immagini PNG o JPEG utilizzando alcune funzionalità Android integrate.

Problemi correlati