Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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();
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
39
Help us understand the problem. What are the problem?