web-dev-qa-db-fra.com

Conversion de bitmap en byteArray android

J'ai un bitmap que je veux envoyer au serveur en l'encodant en base64 mais je ne veux pas compresser l'image au format png ou jpeg.

Maintenant, ce que je faisais auparavant était.

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

Maintenant, je ne veux plus utiliser aucune compression ni aucun format au format simple octet [] à partir de bitmap que je puisse encoder et envoyer au serveur.

Des pointeurs?

48
Asad Khan

Vous pouvez utiliser copyPixelsToBuffer() pour déplacer les données de pixel vers un Buffer, ou vous pouvez utiliser getPixels() et puis convertissez les entiers en octets avec décalage de bits.

copyPixelsToBuffer() est probablement ce que vous voudrez utiliser, voici donc un exemple d'utilisation:

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

au lieu de la ligne suivante dans la réponse @jave:

int bytes = b.getByteCount();

Utilisez la ligne et la fonction suivantes:

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();
}
7
Najeebullah Shah
BitmapCompat.getAllocationByteCount(bitmap);

est utile pour trouver la taille requise du ByteBuffer

4