Converting bitmap to byteArray android

AndroidBitmapBytearrayBase64

Android Problem Overview


I have a bitmap that I want to send to the server by encoding it to base64 but I do not want to compress the image in either png or jpeg.

Now what I was previously doing was.

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

Now I just dont want to use any compression nor any format plain simple byte[] from bitmap that I can encode and send to the server.

Any pointers?

Android Solutions


Solution 1 - Android

You can use copyPixelsToBuffer() to move the pixel data to a Buffer, or you can use getPixels() and then convert the integers to bytes with bit-shifting.

copyPixelsToBuffer() is probably what you'll want to use, so here is an example on how you can use it:

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

Solution 2 - Android

instead of the following line in @jave answer:

int bytes = b.getByteCount();

Use the following line and function:

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

Solution 3 - Android

BitmapCompat.getAllocationByteCount(bitmap);

is helpful to find the required size of the ByteBuffer

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAsad KhanView Question on Stackoverflow
Solution 1 - AndroidJaveView Answer on Stackoverflow
Solution 2 - AndroidNajeebullah ShahView Answer on Stackoverflow
Solution 3 - AndroidJobin Jacob KavalamView Answer on Stackoverflow