2011-10-08 11 views

Respuesta

82

Esto podría funcionar

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
byte[] bitmapdata = bos.toByteArray(); 
ByteArrayInputStream bs = new ByteArrayInputStream(bitmapdata); 
+2

No es una solución ideal, ya que causa bytes de mapa de bits a ser 2 veces en la memoria: en BitmapData y en bos. Entonces es un desperdicio de memoria. – Malachiasz

+9

@Malachiasz Si conoces una mejor manera, agrégala como respuesta y menciónala como un comentario a mi respuesta. Las personas futuras lo notarán. – blessenm

+0

[Esta publicación] (https://stackoverflow.com/a/43669060/4515489) informa que los datos EXIF ​​se pierden en compresión, por lo que si alguien desea la secuencia de entrada para leer información EXIF ​​de un mapa de bits en memoria, entonces otra método sería necesario. – jk7

3

Ésta es mi manera:

// Your Bitmap. 
Bitmap bitmap = XXX; 

int byteSize = bitmap.getRowBytes() * bitmap.getHeight(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(byteSize); 
bitmap.copyPixelsToBuffer(byteBuffer); 

// Get the byteArray. 
byte[] byteArray = byteBuffer.array(); 

// Get the ByteArrayInputStream. 
ByteArrayInputStream bs = new ByteArrayInputStream(byteArray); 
+0

Una advertencia sobre el uso de getRowBytes(), "A partir de KITKAT, este método no se debe utilizar para calcular el uso de memoria del mapa de bits. En su lugar, consulte getAllocationByteCount()." - desde [aquí] (https://developer.android.com/reference/android/graphics/Bitmap.html#getRowBytes()) – jk7

+0

Por otro lado, getAllocationByteCount() requiere API 19. – jk7

Cuestiones relacionadas