51

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?

Asad Khan
  • 11,469
  • 13
  • 44
  • 59

3 Answers3

138

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.
petrnohejl
  • 7,581
  • 3
  • 51
  • 63
Jave
  • 31,598
  • 14
  • 77
  • 90
9

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();
}
Chandresh Kachariya
  • 667
  • 2
  • 13
  • 31
Najeebullah Shah
  • 4,164
  • 4
  • 35
  • 49
6
BitmapCompat.getAllocationByteCount(bitmap);

is helpful to find the required size of the ByteBuffer