Вопрос по android – Преобразование растрового изображения в ByteArray Android

47

У меня есть растровое изображение, которое я хочу отправить на сервер, кодируя его в base64, но я не хочу сжимать изображение в png или jpeg.

Теперь то, что я делал раньше, было.

<code>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);
</code>

Теперь я просто не хочу использовать ни сжатие, ни какой-либо простой простой формат byte [] из растрового изображения, который я могу кодировать и отправлять на сервер.

Есть указатели?

Ваш Ответ

3   ответа
129

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.
@ShailAdi для вызова getByteCount () вам понадобится API уровня 12.
маленький код очень помог бы :) Asad Khan
@AsadKhan Я добавил пример.
байт [] b; ByteBuffer byteBuffer = ByteBuffer.allocate (bitmapPicture.getByteCount ()); bitmapPicture.copyPixelsToBuffer (ByteBuffer); b = byteBuffer.array (); ??? Asad Khan
Если вы посмотрите на getByteCount (), то подразумеваете, что это просто getRowBytes () * getHeight (), посчитайте самостоятельно, если вы нацеливаетесь & lt; API 12.
6

вместо следующей строки в ответе @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();
}
4
BitmapCompat.getAllocationByteCount(bitmap);

Похожие вопросы