Bitmap bmp = intent.getExtras().get("data");
int size = bmp.getRowBytes() * bmp.getHeight();
ByteBuffer b = ByteBuffer.allocate(size);
bmp.copyPixelsToBuffer(b);
byte[] bytes = new byte[size];
try {
b.get(bytes, 0, bytes.length);
} catch (BufferUnderflowException e) {
// always happens
}
// do something with byte[]
Cuando miro el búfer después de que la llamada a copyPixelsToBuffer
los bytes son todos 0 ... El mapa de bits devuelto por la cámara es inmutable ... pero eso no debería importar ya que está haciendo una copia.
¿Qué podría estar mal con este código?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
fuente
fuente
ByteArrayOutputStream
asignará unbyte[]
tamaño igual a labyte[]
copia de suBitmap
, a continuación,ByteArrayOutputStream.toByteArray()
sin embargo, volverá a asignar otrobyte[]
del mismo tamaño.CompressFormat es demasiado lento ...
Prueba ByteBuffer.
※※※ Mapa de bits al byte ※※※
※※※ byte a mapa de bits ※※※
fuente
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
dóndebytes
está su matriz de bytes?Aquí está la extensión de mapa de bits
.convertToByteArray
escrita en Kotlin.fuente
¿Necesitas rebobinar el búfer, tal vez?
Además, esto podría suceder si el paso (en bytes) del mapa de bits es mayor que la longitud de la fila en píxeles * bytes / píxel. Haga la longitud de bytes b.remaining () en lugar de tamaño.
fuente
rewind()
es la llave. Estaba obteniendo lo mismoBufferUnderflowException
y rebobinando el búfer después de llenarlo resolvió esto.Use las siguientes funciones para codificar el mapa de bits en byte [] y viceversa
fuente
Su conjunto de bytes es demasiado pequeño. Cada píxel ocupa 4 bytes, no solo 1, así que multiplique su tamaño * 4 para que la matriz sea lo suficientemente grande.
fuente
getRowBytes()
toma en cuenta los 4 bytes por píxel.Ted Hopp es correcto, de la documentación de la API:
"... Después de que este método regrese, la posición actual del búfer se actualiza: la posición se incrementa por el número de elementos escritos en el búfer".
y
"Lee los bytes de la posición actual en la matriz de bytes especificada, comenzando en el desplazamiento especificado, y aumenta la posición en la cantidad de bytes leídos".
fuente
Para evitar
OutOfMemory
errores en archivos más grandes, resolvería la tarea dividiendo un mapa de bits en varias partes y fusionando los bytes de sus partes.fuente
Pruebe esto para convertir String-Bitmap o Bitmap-String
fuente