2010-12-14 30 views
46

Tengo una imagen de la web en un ImageView. Es muy pequeño (un favicon) y me gustaría almacenarlo en mi base de datos SQLite. Puedo obtener un Drawable desde mImageView.getDrawable() pero luego no sé qué hacer a continuación. No entiendo completamente la clase Drawable en Android.Drawable to byte []

Sé que puedo obtener una matriz de bytes de una Bitmap como:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

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

byte[] bitmapdata = stream.toByteArray(); 

Pero, ¿cómo puedo obtener una matriz de bytes de una Drawable?

Respuesta

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

Gracias por lo que es obvio !! No pensé en lanzarlo. –

+9

Debe ser: bitmap.compress (Bitmap.CompressFormat.JPEG, 100, stream); De lo contrario, la secuencia no contiene datos ... – Entreco

+0

@Cristian guardé bitmapdata en la base de datos como BLOB, de nuevo cuando recupero mi dibujable de BLOB, el fondo se vuelve negro. ¿Puedes ayudarme? Quiero que el fondo sea transparente como lo era antes de guardarlo en la base de datos. –

-2
File myFile = new File(selectedImagePath); 

byte [] mybytearray = new byte [filelenghth]; 

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

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

ahora la imagen se almacena en la bytearray ..

18

Gracias todos y esto solucionó mi problema.

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

guardé bitMapData en la base de datos como BLOB, de nuevo cuando recupero mi dibujable de BLOB, el fondo se vuelve negro. ¿Puedes ayudarme? Quiero que el fondo sea transparente como lo era antes de guardarlo en la base de datos. –

+0

Creo que es un problema diferente que ocurre de forma paralela a ese proceso. Es genial si puedes proporcionar más detalles para reproducir y verificar. – Randula

+1

estaba sucediendo al guardar con formato JPEG, pero cambié a PNG funciona 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

Esto parece ser menor a la respuesta aceptada de hace dos años ... – Sam

+0

Esta es una mejor respuesta, ya que no funciona t requiere conversión a BitmapDrawable, que el dibujable puede no ser una instancia de. –

+0

@mattsnider Gracias – Kalpesh

0

Si Disponibles es una BitmapDrawable puede probar éste.

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

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

Bitmap.getRowBytes() devuelve el número de bytes entre filas en píxeles del mapa de bits.

Para mayor se refiere este proyecto: LazyList

+1

Esta publicación se marca automáticamente como de baja calidad porque es solo código. ¿Le importaría expandirlo agregando texto para explicar cómo resuelve el problema? – gung