2012-04-17 22 views
46

Ich habe eine Bitmap, die ich an den Server senden möchte, indem Sie es zu base64, aber ich möchte nicht das Bild in Png oder JPEG komprimieren.Konvertieren von Bitmap in ByteArray Android

Jetzt was ich vorher tat war.

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

Jetzt möchte ich eine Kompression noch ein beliebiges Format einfaches einfaches byte [] von Bitmap verwenden, nur nicht, dass ich an den Server verschlüsseln und senden können.

Irgendwelche Zeiger?

Antwort

123

Sie können copyPixelsToBuffer() verwenden, um die Pixeldaten in eine Buffer zu verschieben, oder Sie können getPixels() verwenden und dann die Ganzzahlen in Bytes mit Bitverschiebung umwandeln.

copyPixelsToBuffer() wahrscheinlich ist, was Sie, verwenden möchten, so ist hier ein Beispiel, wie Sie es verwenden können:

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

wenig Code würde sehr helfen :) –

+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 Ich habe ein Beispiel hinzugefügt. – Jave

5

statt der folgenden Zeile in @jave Antwort:

int bytes = b.getByteCount(); 

die folgende Zeile und Funktion:

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

ist hilfreich, um die erforderliche Größe des ByteBuffer zu finden

Verwandte Themen