2010-12-14 28 views
46

J'ai une image du Web dans un ImageView. Il est très petit (un favicon) et je voudrais le stocker dans ma base de données SQLite. Je peux obtenir un Drawable de mImageView.getDrawable() mais je ne sais pas quoi faire ensuite. Je ne comprends pas complètement la classe Drawable dans Android.Drawable to byte []

Je sais que je peux obtenir un tableau d'octets d'un Bitmap comme:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
defaultIcon.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

byte[] bitmapdata = stream.toByteArray(); 

Mais comment puis-je obtenir un tableau d'octets d'un Drawable?

Répondre

110
Drawable d; // the drawable (Captain Obvious, to the rescue!!!) 
Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitmapdata = stream.toByteArray(); 
+0

Merci pour l'évidence !! Je n'ai pas pensé à le lancer. –

+9

Il devrait être: bitmap.compress (Bitmap.CompressFormat.JPEG, 100, stream); Sinon, le flux ne contient aucune donnée ... – Entreco

+0

@Cristian J'ai sauvegardé bitmapdata dans la base de données en tant que BLOB, encore une fois quand je retrouve mon dessin de BLOB, l'arrière-plan devient noir. Pouvez-vous m'aider? Je veux que l'arrière-plan soit transparent tel qu'il était avant d'enregistrer dans la base de données. –

-2
File myFile = new File(selectedImagePath); 

byte [] mybytearray = new byte [filelenghth]; 

BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(myFile)); 

bis1.read(mybytearray,0,mybytearray.length); 

maintenant l'image est stockée dans le bytearray ..

18

Merci à tous et cela a résolu mon problème.

Resources res = getResources(); 
Drawable drawable = res.getDrawable(R.drawable.my_pic); 
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

j'ai enregistré bitMapData dans la base de données comme BLOB, encore une fois quand je retrouve mon dessinable de BLOB, l'arrière-plan devient noir. Pouvez-vous m'aider? Je veux que l'arrière-plan soit transparent tel qu'il était avant d'enregistrer dans la base de données. –

+0

Je pense que c'est un problème différent qui se produit parallèlement à ce processus. C'est génial si vous pouvez fournir plus de détails pour reproduire et vérifier. – Randula

+1

cela se passait lors de l'enregistrement au format JPEG, mais j'ai changé pour PNG son fonctionnement bien ... –

5
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tester); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

Cela semble être une mineure à la réponse acceptée d'il y a deux ans ... – Sam

+0

Ceci est une meilleure réponse, car il doesn ' • Il n'est pas nécessaire de lancer la conversion vers BitmapDrawable, ce qui n'est pas forcément une instance de l'extractible. –

+0

@mattsnider Merci – Kalpesh

0

Si Drawable est un BitmapDrawable vous pouvez essayer celui-ci.

long getSizeInBytes(Drawable drawable) { 
    if (drawable == null) 
     return 0; 

    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
    return bitmap.getRowBytes() * bitmap.getHeight(); 
} 

Bitmap.getRowBytes() renvoie le nombre d'octets entre les rangées dans les pixels de l'image bitmap.

Pour en savoir plus se référer ce projet: LazyList

+1

Ce message est automatiquement signalé comme de mauvaise qualité car il ne s'agit que de code. Pourriez-vous l'agrandir en ajoutant du texte pour expliquer comment il résout le problème? – gung