大きい画像の表示

大きい画像の表示

大きな画像は、リサンプルして読み込むことで
読み込み速度の向上
大きな画像を読み込むときに問題になる
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にリサンプル値を設定することで
適切な解像度で画像を読み込める

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です