web-dev-qa-db-ja.com

ビットマップをbyteArrayに変換android

Base64にエンコードしてサーバーに送信したいビットマップがありますが、pngまたはjpegで画像を圧縮したくありません。

さて、以前私がやっていたことはそうでした。

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

今、私は圧縮したり、エンコードしたりサーバーに送信したりできるビットマップからの単純で単純なbyte []形式を使いたくありません。

ポインタはありますか?

48
Asad Khan

copyPixelsToBuffer() を使用してピクセルデータをBufferに移動するか、または getPixels() を使用できます。次に、ビットシフトを使用して整数をバイトに変換します。

copyPixelsToBuffer()はおそらく使用したいものです。そのため、使用方法の例を次に示します。

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

@jave answerの次の行の代わりに:

int bytes = b.getByteCount();

次の行と関数を使用します。

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

byteBufferの必要なサイズを見つけるのに役立ちます

4