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[]
Quando olho para o buffer depois que a chamada para copyPixelsToBuffer
os bytes é 0 ... O bitmap retornado da câmera é imutável ... mas isso não deve importar, pois está fazendo uma cópia.
O que poderia estar errado com esse código?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
fonte
fonte
ByteArrayOutputStream
alocará umbyte[]
tamanho igual aobyte[]
respetivo suporte eBitmap
, em seguidaByteArrayOutputStream.toByteArray()
, alocará novamente outrobyte[]
tamanho do mesmo tamanho.CompressFormat está muito lento ...
Experimente o ByteBuffer.
※※※ Bitmap para byte ※※※
※※※ byte para bitmap ※※※
fonte
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
ondebytes
é a sua matriz de bytesAqui está a extensão de bitmap
.convertToByteArray
escrita no Kotlin.fonte
Você precisa rebobinar o buffer, talvez?
Além disso, isso pode acontecer se o passo (em bytes) do bitmap for maior que o comprimento da linha em pixels * bytes / pixel. Torne o comprimento dos bytes b.remaining () em vez do tamanho.
fonte
rewind()
É a chave. Eu estava recebendo o mesmoBufferUnderflowException
e rebobinando o buffer depois de preenchê-lo, resolvi isso.Use as funções abaixo para codificar bitmap em byte [] e vice-versa
fonte
Sua matriz de bytes é muito pequena. Cada pixel ocupa 4 bytes, não apenas 1, então multiplique seu tamanho * 4 para que a matriz seja grande o suficiente.
fonte
getRowBytes()
leva em consideração os 4 bytes por pixel.Ted Hopp está correto, na documentação da API:
"... Depois que esse método retorna, a posição atual do buffer é atualizada: a posição é incrementada pelo número de elementos gravados no buffer."
e
"Lê bytes da posição atual na matriz de bytes especificada, iniciando no deslocamento especificado e aumenta a posição pelo número de bytes lidos."
fonte
Para evitar
OutOfMemory
erros em arquivos maiores, eu resolvia a tarefa dividindo um bitmap em várias partes e mesclando os bytes de suas partes.fonte
Tente isso para converter String-Bitmap ou Bitmap-String
fonte