Преобразование 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