2012-04-17 3 views
46

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

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

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

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

Любые указатели?

ответ

123

Вы можете использовать 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

небольшой код очень поможет :) –

+1

byte [] b; \t \t \t ByteBuffer byteBuffer = ByteBuffer.allocate (bitmapPicture.getByteCount()); \t \t bitmapPicture.copyPixelsToBuffer (byteBuffer); \t \t b = byteBuffer.array(); ??? –

+0

@AsadKhan Я добавил пример. – Jave

5

вместо следующей строки в @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

Смежные вопросы