Domanda

Ho un mucchio di immagini memorizzate nel database del mio server come array di byte che mi piacerebbe di consumare nella mia app Android.

Gli array di byte sono stati creati da immagini in un Windows Phone 7 app, in modo da utilizzare WriteableBitmap di NET (WBMP) per salvare in un IsolatedStorageFileStream (ISFS):

     wbmp.SaveJpeg(isfs, newWidth, newHeight, 0, 90);

In applicazione Android, ho un widget di ImageView che sto cercando di utilizzare per visualizzare una delle immagini. Ho provato con BitmapFactory per decodificare l'array di byte (payload):

    Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
    img1.setImageBitmap(bmp); 

Ma che non funziona - non viene visualizzata l'immagine e BMP è nulla quando faccio un passo attraverso il debugger. Questo sembra indicare che BitmapFactory non poteva decodificare correttamente l'array di byte.

Per Windows Phone 7, ho appena caricare il byte [] (realtà) in un MemoryStream (mstream), quindi chiamare il Bitmap (BMP) 's metodo SetSource con quella MemoryStream:

    mstream = new MemoryStream(reality);
    bmp.SetSource(mstream);

Allora su Android ho provato a leggere l'array di byte in un MemoryFile poi caricare InputStream del MemoryFile utilizzando BitmapFactory:

    MemoryFile mf;
        try {
            mf = new MemoryFile("myFile", payload.length);
            mf.writeBytes(payload, 0, 0, payload.length);
            InputStream is = mf.getInputStream();
            Bitmap bmp = BitmapFactory.decodeStream(is);
            img1.setImageBitmap(bmp); 
        } catch (IOException e) {               
            e.printStackTrace();
        }

Ma questo ancora non funziona.

Come faccio a caricare correttamente un array di byte in questo formato in Android per visualizzare l'immagine?

È stato utile?

Soluzione

Secondo Bing e qui, questo errore indica probabilmente un'immagine non valida. Vorrei attentamente controllare due volte che si sta scaricando il diritto URL. Se è così, provare a stampare il contenuto di quel byte [] per il registro (o controllare nel debugger); vedere se si tratta di un messaggio HTML di qualche tipo.

Bingo! Sulla base delle informazioni in più, si tratta di dati con codifica Base64. Quello che hai postato assomigliava troppo testo semplice, così ho provato a fare funzionare attraverso sia uudecode e base64 -d sulla mia macchina Linux. Quest'ultimo ha lavorato, generando un file che è stato riconosciuto come JPEG.

Decodifica questo dovrebbe essere abbastanza semplice. Modificare questa:

Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
img1.setImageBitmap(bmp); 

a questo:

import android.util.Base64;
...
payload = Base64.decode(payload, Base64.Default);
Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
img1.setImageBitmap(bmp); 

Fatemi sapere!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top