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[]
Ketika saya melihat buffer setelah panggilan ke copyPixelsToBuffer
byte adalah semua 0 ... Bitmap yang dikembalikan dari kamera tidak dapat diubah ... tapi itu tidak masalah karena ia sedang menyalin.
Apa yang salah dengan kode ini?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
sumber
sumber
ByteArrayOutputStream
akan mengalokasikanbyte[]
ukuran yang sama denganbyte[]
dukungan AndaBitmap
, kemudianByteArrayOutputStream.toByteArray()
akan lagi mengalokasikan yang lainbyte[]
dengan ukuran yang sama.CompressFormat terlalu lambat ...
Coba ByteBuffer.
※※※ Bitmap ke byte ※※※
※※※ byte ke bitmap ※※※
sumber
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
manabytes
array byte AndaBerikut ini adalah ekstensi bitmap yang
.convertToByteArray
ditulis di Kotlin.sumber
Apakah Anda perlu memundurkan buffer, mungkin?
Juga, ini mungkin terjadi jika langkah (dalam byte) dari bitmap lebih besar dari panjang baris dalam piksel * byte / piksel. Buat panjang byte b.remaining () alih-alih ukuran.
sumber
rewind()
adalah kuncinya. Saya mendapatkan yang samaBufferUnderflowException
dan memutar ulang buffer setelah mengisinya menyelesaikan ini.Gunakan fungsi di bawah ini untuk menyandikan bitmap ke byte [] dan sebaliknya
sumber
Array byte Anda terlalu kecil. Setiap piksel membutuhkan 4 byte, bukan hanya 1, jadi gandakan ukuran Anda * 4 sehingga arraynya cukup besar.
sumber
getRowBytes()
membawa 4 byte per piksel ke akun.Ted Hopp benar, dari Dokumentasi API:
"... Setelah metode ini kembali, posisi buffer saat ini diperbarui: posisinya bertambah dengan jumlah elemen yang ditulis dalam buffer."
dan
"Membaca byte dari posisi saat ini ke dalam array byte yang ditentukan, mulai dari offset yang ditentukan, dan meningkatkan posisi dengan jumlah byte yang dibaca."
sumber
Untuk menghindari
OutOfMemory
kesalahan pada file yang lebih besar, saya akan menyelesaikan tugas dengan memecah bitmap menjadi beberapa bagian dan menggabungkan byte bagian mereka.sumber
Coba ini untuk mengonversi String-Bitmap atau Bitmap-String
sumber