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[]
Когда я смотрю на буфер после вызова copyPixelsToBuffer
всех байтов равны 0 ... Растровое изображение, возвращаемое с камеры, является неизменным ... но это не должно иметь значения, так как он делает копию.
Что может быть не так с этим кодом?
java
android
serialization
bitmap
bytebuffer
Том Фобер
источник
источник
ByteArrayOutputStream
выделитеbyte[]
размер, равныйbyte[]
сумме поддержкиBitmap
, затемByteArrayOutputStream.toByteArray()
снова выделите еще одинbyte[]
такой же размер.CompressFormat работает слишком медленно ...
Попробуйте ByteBuffer.
※※※ Растровое изображение в байт ※※※
※※※ байт в растровое изображение ※※※
источник
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length)
гдеbytes
находится ваш байтовый массивВот растровое расширение,
.convertToByteArray
написанное на Kotlin.источник
Возможно, вам нужно перемотать буфер?
Кроме того, это может произойти, если шаг (в байтах) растрового изображения превышает длину строки в пикселях * байт / пиксель. Сделайте длину байтов b.remaining () вместо размера.
источник
rewind()
это ключ. Я получал то же самоеBufferUnderflowException
и перематывал буфер после заполнения, это решило это.Используйте следующие функции для кодирования растрового изображения в byte [] и наоборот
источник
Ваш байтовый массив слишком мал. Каждый пиксель занимает 4 байта, а не только 1, поэтому умножьте ваш размер * 4, чтобы массив был достаточно большим.
источник
getRowBytes()
принимает на учет 4 байта на пиксель.Тед Хопп прав, из документации API:
«... После возврата этого метода текущая позиция буфера обновляется: позиция увеличивается на количество элементов, записанных в буфере».
и
Msgstr "Считывает байты из текущей позиции в указанный байтовый массив, начиная с указанного смещения, и увеличивает позицию на количество прочитанных байтов."
источник
Чтобы избежать
OutOfMemory
ошибок для больших файлов, я решил бы эту задачу, разбив растровое изображение на несколько частей и объединив байты их частей.источник
Попробуйте это преобразовать String-Bitmap или Bitmap-String
источник