¿Cómo se transforma un Bitmap
en un InputStream
?Android: Transforme un mapa de bits en un flujo de entrada
Me gustaría utilizar este InputStream
como entrada a la función ETC1Util.loadTexture()
.
¿Cómo se transforma un Bitmap
en un InputStream
?Android: Transforme un mapa de bits en un flujo de entrada
Me gustaría utilizar este InputStream
como entrada a la función ETC1Util.loadTexture()
.
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);
É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);
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
Por otro lado, getAllocationByteCount() requiere API 19. – jk7
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
@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
[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