画像データの取り扱い
画像ファイルを読み込み、それを画像処理するようなアプリを作成していたときに、様々な画像フォーマット(jpeg,png,bmp等)をBitmapクラスに変換して扱いたいことがありました。
また逆に、Bitmapからjpeg・png圧縮したり、byte配列に変換したい場合もありました。
本記事では、それらの相互変換についてメモしておきます。
形式の相互変換の方法
本記事では、Android SDKの”Bitmapクラス”と”画像フォーマットのbitmap”を区別するために、前者は”Bitmap”、後者は”bmp”と表記します。
byte配列(bmp) → Bitmap
Bitmap.createBitmap()に画像の縦横サイズ、bmpの形式を指定してBitmapを生成する。
生成したBitmapの中身に、ByteBuffer経由でbyte配列をコピーする。
// 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形式はこちらでデコードできない様子。
// jpgarr(byte[])に、jpegやpngなどの圧縮形式で画像データが入っている前提
Bitmap bitmap = BitmapFactory.decodeByteArray(jpgarr, 0, jpgarr.length);
Bitmap → byte配列(bmp形式)
Bitmap.copyPixelsToBuffer()でByteBufferに値をコピーし、ByteBufferからbyte配列を取り出す。
// 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配列を取り出す。
// bitmap(Bitmap)に画像データが入っている前提
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpgarr = baos.toByteArray();