Question

J'ai un tas d'images stockées dans la base de données de mon serveur sous forme de tableaux d'octets que je voudrais consommer dans mon application Android.

Les tableaux d'octets ont été créés à partir d'images dans une application Windows Phone 7, donc l'utilisation de WriteableBitmap de .NET (wbmp) pour sauver à un IsolatedStorageFileStream (des SISA):

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

Dans l'application Android, j'ai un widget ImageView que je suis en train d'utiliser pour afficher l'une des images. Je l'ai essayé d'utiliser BitmapFactory pour décoder le tableau d'octets (charge utile):

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

Mais cela ne fonctionne pas - aucune image se affiche et bmp est nulle lorsque je fais un pas dans le débogueur. Cela semble indiquer que BitmapFactory ne pouvait décoder correctement le tableau d'octets.

Pour Windows Phone 7, je charge que l'octet [] (la réalité) dans un MemoryStream (mstream), puis appelez la Bitmap (bmp) 's méthode SetSource avec cette MemoryStream:

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

Alors sur Android J'ai essayé de lire le tableau d'octets dans un MemoryFile puis charger InputStream en utilisant BitmapFactory du MemoryFile:

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

Mais cela ne fonctionne toujours pas.

Comment puis-je charger avec succès un tableau d'octets dans ce format dans Android pour afficher l'image?

Était-ce utile?

La solution

Selon Bing et ici, cette erreur indique probablement une image non valide. Je soigneusement REVÉRIFIER que vous téléchargez directement l'URL. Si oui, essayez d'imprimer le contenu de cet octet [] dans le journal (ou vérifier dans le débogueur); voir si elle est un message HTML de quelque sorte.

Bingo! Sur la base de vos informations supplémentaires, ce sont des données codées en base64. Qu'est-ce que vous avez publié ressemblait trop le texte brut, donc j'essayé de courir à travers les deux uudecode et base64 -d sur ma machine Linux. Ce dernier a travaillé, la génération d'un fichier qui a été reconnu comme JPEG.

Décodage cela devrait être assez simple. Changer ceci:

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

à ceci:

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

Faites-moi savoir!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top