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[]
Wenn ich mir den Puffer nach dem Aufruf copyPixelsToBuffer
der Bytes ansehe, sind alle 0 ... Die von der Kamera zurückgegebene Bitmap ist unveränderlich ... aber das sollte keine Rolle spielen, da sie eine Kopie erstellt.
Was könnte an diesem Code falsch sein?
java
android
serialization
bitmap
bytebuffer
Tom Fobear
quelle
quelle
ByteArrayOutputStream
werden einebyte[]
Größe zuweisen , die derbyte[]
Unterlage entsprichtBitmap
, und dannByteArrayOutputStream.toByteArray()
erneut einebyte[]
Größe derselben Größe zuweisen .CompressFormat ist zu langsam ...
Versuchen Sie es mit ByteBuffer.
※※※ Bitmap zu Byte ※※※
※※※ Byte zur Bitmap ※※※
quelle
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
Wobytes
ist Ihr Byte-ArrayHier ist die Bitmap-Erweiterung,
.convertToByteArray
die in Kotlin geschrieben wurde.quelle
Müssen Sie den Puffer möglicherweise zurückspulen?
Dies kann auch passieren, wenn der Schritt (in Bytes) der Bitmap größer ist als die Zeilenlänge in Pixel * Bytes / Pixel. Stellen Sie die Länge der Bytes b.remaining () anstelle der Größe ein.
quelle
rewind()
ist der Schlüssel. Ich bekam das gleicheBufferUnderflowException
und spulte den Puffer zurück, nachdem ich ihn gefüllt hatte, um dies zu beheben.Verwenden Sie die folgenden Funktionen, um die Bitmap in Byte [] zu codieren und umgekehrt
quelle
Ihr Byte-Array ist zu klein. Jedes Pixel benötigt 4 Bytes, nicht nur 1. Multiplizieren Sie also Ihre Größe * 4, damit das Array groß genug ist.
quelle
getRowBytes()
Berücksichtigt die 4 Bytes pro Pixel.Ted Hopp ist korrekt, aus der API-Dokumentation:
"... Nachdem diese Methode zurückgekehrt ist, wird die aktuelle Position des Puffers aktualisiert: Die Position wird um die Anzahl der in den Puffer geschriebenen Elemente erhöht."
und
"Liest Bytes von der aktuellen Position in das angegebene Byte-Array, beginnend mit dem angegebenen Offset, und erhöht die Position um die Anzahl der gelesenen Bytes."
quelle
Um
OutOfMemory
Fehler bei größeren Dateien zu vermeiden , würde ich die Aufgabe lösen, indem ich eine Bitmap in mehrere Teile aufteile und die Bytes ihrer Teile zusammenführe.quelle
Versuchen Sie dies, um String-Bitmap oder Bitmap-String zu konvertieren
quelle