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[]
Kiedy patrzę na bufor po wywołaniu copyPixelsToBuffer
bajtów, wszystkie mają wartość 0 ... Bitmapa zwrócona z kamery jest niezmienna ... ale to nie powinno mieć znaczenia, ponieważ wykonuje kopię.
Co może być nie tak z tym kodem?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
źródło
źródło
ByteArrayOutputStream
przydzielibyte[]
wielkości równebyte[]
poparcie swojejBitmap
, po czymByteArrayOutputStream.toByteArray()
jeszcze będzie ponownie przydzielić innybyte[]
o tej samej wielkości.Format kompresji jest zbyt wolny ...
Wypróbuj ByteBuffer.
※※※ Bitmapa na bajt ※※※
※※※ bajt na bitmapę ※※※
źródło
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
gdziebytes
jest twoja tablica bajtówOto rozszerzenie bitmapy
.convertToByteArray
napisane w Kotlinie.źródło
Być może potrzebujesz przewinąć bufor?
Może się to również zdarzyć, jeśli krok (w bajtach) bitmapy jest większy niż długość wiersza w pikselach * bajtach / piksel. Ustaw długość bajtów b.remaining () zamiast rozmiaru.
źródło
rewind()
jest kluczem. Robiłem to samoBufferUnderflowException
i przewijanie bufora po jego wypełnieniu rozwiązało to.Użyj poniższych funkcji, aby zakodować bitmapę w bajt [] i odwrotnie
źródło
Twoja tablica bajtów jest za mała. Każdy piksel zajmuje 4 bajty, a nie tylko 1, więc pomnóż swój rozmiar * 4, aby tablica była wystarczająco duża.
źródło
getRowBytes()
bierze pod uwagę 4 bajty na piksel.Ted Hopp jest poprawny, z Dokumentacji API:
„... Po powrocie tej metody bieżąca pozycja bufora jest aktualizowana: pozycja jest zwiększana o liczbę elementów zapisanych w buforze.”
i
„Odczytuje bajty z bieżącej pozycji do określonej tablicy bajtów, zaczynając od określonego przesunięcia, i zwiększa pozycję o liczbę odczytanych bajtów.”
źródło
Aby uniknąć
OutOfMemory
błędu w przypadku większych plików, rozwiązałbym to zadanie, dzieląc mapę bitową na kilka części i łącząc bajty ich części.źródło
Spróbuj przekonwertować String-Bitmap lub Bitmap-String
źródło