Преобразование bitmap в byteArray android
У меня есть растровое изображение, которое я хочу отправить на сервер, закодировав его на base64, но я не хочу сжимать изображение в png или jpeg.
Теперь то, что я раньше делал, было.
ByteArrayOutputStream byteArrayBitmapStream = new ByteArrayOutputStream();
bitmapPicture.compress(Bitmap.CompressFormat.PNG, COMPRESSION_QUALITY, byteArrayBitmapStream);
byte[] b = byteArrayBitmapStream.toByteArray();
//then simple encoding to base64 and off to server
encodedImage = Base64.encodeToString(b, Base64.NO_WRAP);
Теперь я просто не хочу использовать какое-либо сжатие или какой-либо формат простой простой байт [] из растрового изображения, который я могу кодировать и отправлять на сервер.
Любые указатели?
Ответы
Ответ 1
Вы можете использовать copyPixelsToBuffer()
, чтобы переместить пиксельные данные в Buffer
, или вы можете использовать getPixels()
, а затем преобразовать целые числа в байты с битовым сдвигом.
copyPixelsToBuffer()
, вероятно, вы хотите использовать, поэтому вот пример того, как вы можете его использовать:
//b is the Bitmap
//calculate how many bytes our image consists of.
int bytes = b.getByteCount();
//or we can calculate bytes this way. Use a different value than 4 if you don't use 32bit images.
//int bytes = b.getWidth()*b.getHeight()*4;
ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer
b.copyPixelsToBuffer(buffer); //Move the byte data to the buffer
byte[] array = buffer.array(); //Get the underlying array containing the data.
Ответ 2
вместо следующей строки в ответе @jave:
int bytes = b.getByteCount();
Используйте следующую строку и функцию:
int bytes = byteSizeOf(b);
protected int byteSizeOf(Bitmap data) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
return data.getRowBytes() * data.getHeight();
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return data.getByteCount();
} else {
return data.getAllocationByteCount();
}
Ответ 3
BitmapCompat.getAllocationByteCount(bitmap);
полезно найти требуемый размер ByteBuffer