虚苦心観察ブログ

ブログ管理者である虚苦心が私利私欲に基づいて書いているブログです。主にガジェットのレビューだったり、画像処理のことだったりを記事にしています。

Androidで画像をデコードするときの注意点

Androidでは画像の読み込み方法に大きく分けて二つの方法がある。

  1. SDカードなどパスを指定しての画像読み込み
  2. リソースフォルダdrawableに入っている画像のIDを指定して画像を読み込み

前者は基本的に副作用のないごく普通の画像デコード。
しかし後者は知らないと躓く場合があるのでまとめておく。

decodeResourceは画像のサイズ変更が行われる

BitmapFactoryのdecodeResouceメソッドは読み込んだ画像をViewで表示することを目的に作られているらしく、読み込んだ画像はAndroid端末の解像度に合わせて自動的にサイズ変更されたうえでBitmapインスタンスとして渡される。
単に画面上に表示するだけであれば問題ないが、画像処理をするために読み込んだ場合はこれが問題となることがあるので注意が必要。

Android2系ではdecodeResourceでBitmap.Configを指定しても無視される

Android4系では無視されることがないので2系に対応しているアプリを開発している場合は注意が必要である。

解像度は元画像のサイズ、Bitmap.Configを指定して読み込みたい(Android2系)、といった場合はdecodeStreamを使う。
decodeStreamの引数にはInputStreamが必要となる。
リソースファイルをInputStreamとして取得するにはResourcesのopenRawStreamメソッドを利用する。
以下は実装例。

InputStream istr = context.getResources().openRawStream(R.drawable.image);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferedConfig = Bitmap.Config.ARGB_8888;
Bitmap image = BitmapFactory.decodeStream(istr, null, opts);