LoginSignup
43

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-30

画像データの取り扱い

画像ファイルを読み込み、それを画像処理するようなアプリを作成していたときに、様々な画像フォーマット(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();

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43