2012-04-17 23 views
46

Tôi có một bitmap mà tôi muốn gửi tới máy chủ bằng cách mã hóa nó thành base64 nhưng tôi không muốn nén hình ảnh trong png hoặc jpeg.Chuyển đổi bitmap thành byteArray android

Bây giờ những gì tôi đã làm trước đó.

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

Bây giờ tôi chỉ không muốn sử dụng bất kỳ nén cũng như bất kỳ định dạng đơn giản byte [] từ bitmap mà tôi có thể mã hóa và gửi đến máy chủ.

Mọi con trỏ?

Trả lời

123

Bạn có thể sử dụng copyPixelsToBuffer() để di chuyển dữ liệu pixel sang Buffer hoặc bạn có thể sử dụng getPixels() và sau đó chuyển đổi số nguyên thành byte bằng dịch chuyển bit.

copyPixelsToBuffer() có lẽ là những gì bạn sẽ muốn sử dụng, vì vậy đây là một ví dụ về cách bạn có thể sử dụng nó:

//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

mã nhỏ sẽ giúp ích rất nhiều :) –

+1

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

+0

@AsadKhan Tôi đã thêm một ví dụ. – Jave

5

thay vì dòng sau trong câu trả lời @jave:

int bytes = b.getByteCount(); 

Sử dụng dòng và chức năng sau:

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

hữu ích để tìm kích thước yêu cầu của ByteBuffer