大きい画像の表示
大きな画像は、リサンプルして読み込むことで
読み込み速度の向上
大きな画像を読み込むときに問題になる
OutOfMemoryを未然に防ぐことができる
まずは、画像情報の取得
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds(); input = getContentResolver().openInputStream(imageUri); BitmapFactory.decodeStream(input,null,options);
次に、リサンプルの計算
int inSampleSize = calculateInSampleSize(options,MAX_IMAGE_SIZE, MAX_IMAGE_SIZE);
そして、ユーザー関数 calculateInImageSize()の定義
これは、必要な画像サイズを渡すと
そのサイズにあったリサンプル値を返す
private int calculateInSampleSize(BitmapFactory.Options, int reqWidth, int reqHeight){ final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if(height > reqHeight || width > reqWidth){ if(width > height){ inSampleSize = Math.round((float)height / (float)reqHeight); }else{ inSampleSize = Math.round((float)width / (float)reqWidth); } } return inSampleSize; }
これで、値の算出ができるので
次に、リサンプルして画像を読み込む
options.inJustDecodeBounds = false; options.inSampleSize = inSampleSize; input = getContentResolver().openInputStream(imageUri); Bitmap bitmap = BitmapFactory.decodeStream(input,null,options);
大きな画像を読み込むと
画像が端末のメモリに入りきらず
OutOfMemoryが発生してアプリが終了することがある
これをふせぐため
画像の情報を事前に読み込み
幅、高さからリサンプル値を求め
画像に適切な大きさにすることで
OutOfMemoryを防止できる
今回、画像情報を読み込むため
BitmapFactory.Optionsの
inJustDecodeBoundsフラグを trueにして
画像のヘッダ情報だけ読み込む
この場合、画像本体は読み込んでないので高速に処理できる
その後に、画像情報からリサンプル値を求め
再度
inJustDecodeBoundsにfalseを設定することで
画像全体を読み込む
つまり、
inJustDecodeBoundsが
trueならヘッダ情報だけ
falseなら全部読み込む
このときにinSampleSizeにリサンプル値を設定することで
適切な解像度で画像を読み込める