AndroidでのBitmap/JPEG/byte配列の相互変換


画像データの取り扱い

画像ファイルを読み込み、それを画像処理するようなアプリを作成していたときに、様々な画像フォーマット(jpeg,png,bmp等)をBitmapクラスに変換して扱いたいことがありました。

また逆に、Bitmapからjpeg・png圧縮したり、byte配列に変換したい場合もありました。

本記事では、それらの相互変換についてメモしておきます。


形式の相互変換の方法

本記事では、Android SDKの”Bitmapクラス”と”画像フォーマットのbitmap”を区別するために、前者は”Bitmap”、後者は”bmp”と表記します。


byte配列(bmp) → Bitmap

Bitmap.createBitmap()に画像の縦横サイズ、bmpの形式を指定してBitmapを生成する。

生成したBitmapの中身に、ByteBuffer経由でbyte配列をコピーする。


bmparr2bitmap.java

// bmparr(byte[])に、bmp形式で画像データが入っている前提

// width, height: 画像データのサイズ
Bitmap bitmap = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bmparr));


byte配列(jpeg,png等) → Bitmap

BitmapFactory.decodeByteArray()を用いる。

このメソッドは、jpegやpngなどで圧縮されたデータをBitmapにデコードする。

bmp形式はこちらでデコードできない様子。


jpegarr2bitmap.java

// jpgarr(byte[])に、jpegやpngなどの圧縮形式で画像データが入っている前提

Bitmap bitmap = BitmapFactory.decodeByteArray(jpgarr, 0, jpgarr.length);


Bitmap → byte配列(bmp形式)

Bitmap.copyPixelsToBuffer()でByteBufferに値をコピーし、ByteBufferからbyte配列を取り出す。


bitmap2bmparr.java

// bitmap(Bitmap)に画像データが入っている前提

ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(byteBuffer);
byte[] bmparr = byteBuffer.array();


Bitmap → byte配列(jpeg,png等)

Bitmap.compress()でBitmapからjpeg/png等の形式に圧縮し、ByteArrayOutputStreamに渡す。

ByteArrayOutputStreamからbyte配列を取り出す。


bitmap2jpgarr.java

// bitmap(Bitmap)に画像データが入っている前提

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpgarr = baos.toByteArray();