2013-06-19 10 views
6

Sto caricando un'immagine da un URL per essere mostrata in un ImageView. Il metodo standard è quello di creare una bitmap come segue (dove l'InputStream is è stato ottenuto dal URL):Android: come eseguire il rendering di un'immagine di streaming al volo su ImageView senza caricare la bitmap completa?

Bitmap bm = BitmapFactory.decodeStream(is); 

Ma ho a che fare con le immagini di grandi dimensioni, e voglio per avviare la visualizzazione pixel prima che l'intera immagine è caricato nella bitmap cioè voglio ottenere il rendering progressivo dell'immagine (simile al caricamento di immagini di grandi dimensioni nei browser web). Se l'immagine è, ad esempio, un PNG interlacciato, questo mi consentirà di mostrare agli utenti un'immagine di qualità inferiore mentre attendono il caricamento completo dell'immagine. Fondamentalmente, voglio ottenere il rendering come illustrato nella http://www.codinghorror.com/blog/2005/12/progressive-image-rendering.html

lo so se ho potuto implementare un decoder PNG, o utilizzare un'implementazione opensource, ho potuto modificarlo per rendere i pixel bitmap della ImageView non appena li ho letti, ma sembra uno sforzo gigantesco per quello che intendo.

risposta

0

Semplice rendering progressivo come ricevuto: Ciò viene ottenuto considerando il livello di rete di trasmissione (TCP). Ogni pacchetto ricevuto in ordine, viene consegnato nel livello dell'applicazione che viene visualizzato immediatamente. Se si desidera ottenere ciò, è necessario pensare alla programmazione dei socket nell'applicazione.

Tuttavia, questo è un vecchio approccio e in realtà uno più intensivo di calcolo. Personalmente preferisco, lavorando con un'immagine stub. L'immagine stub viene mostrata all'inizio e viene avviato un thread immediato con una connessione url e download (manager o cache). Una volta completato il download, si ritorna al thread principale per aggiornare la foto. Questo è più organizzabile.

Per favore correggimi se sbaglio in qualsiasi senso.

+0

Il problema principale del primo approccio è che i dati dell'immagine non arrivano in pixel retti, ma sono compressi e organizzati in base al formato dell'immagine che utilizzo (ad esempio PNG). Anche se mi occupassi di singoli pacchetti, lo sforzo maggiore sarebbe quello di convertire quei dati in valori di colore dei pixel prima del rendering, il che equivale a scrivere un decodificatore per il suddetto formato di immagine (questo sarebbe eccessivo). Stavo piuttosto cercando un metodo/libreria esistente che sarebbe più semplice. Il tuo secondo approccio, ovviamente, è molto più semplice. L'ho mantenuto come opzione di backup se non funziona nient'altro :) –

0

Prova progetto Freso di Facebook: http://frescolib.org/#streaming Non sono sicuro di quali formati di file supporti, ma supporta il rendering progressivo di file JPEG che sono stati codificati progressivamente.

Problemi correlati