Androidで大容量データをImageViewに読み込む場合、OutOfMemoryが発生する事がある。
もちろん通常のjavaでも大容量データを扱う場合同様の事が発生する可能性があるわけでして…
Androidの場合はそれが顕著になっている様子。(上限や設定値などは未調査)
ひとまずその解決法をアップ。
やる事は『画像をリサンプリング(再標本化)する』という事。
リサンプリングについてはここには詳しく記載しません。
(というより記載できません。詳しくは知らないので…
)
雰囲気を感じ取れる程度のソースを以下に記載。
===========================================================================
// ①画像情報のみ取得
InputStream iStream = context.getContentResolver().openInputStream(uri);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
Bitmap bmp = iBitmapFactory.decodeStream(iStream, null, opt);
iStream.close();
iStream = null;
// ②取得した画像情報からリサンプル値を取得(変換後サイズを300とする)
int resample = 1 + (opt.outWidth/300);
// ③画像をリサンプリング
iStream = context.getContentResolver().openInputStream(uri);
opt.inSampleSize = resample;
opt.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeStream(iStream, null, opt);
===========================================================================
ポイントは上記ソース内のコメントの通りで全3工程で行う事。
①まずはリサンプル値を求めるために、画像情報を読み込む。
②その後、読みん込んだ値からリサンプル値を算出。
※上記例では実際の画像とリサンプル後の横幅の比率より値を算出しているが
必要であれば縦の比率も取得可能。
③最終的に算出したリサンプル値で画像を変換する。
こんな感じ
もちろん通常のjavaでも大容量データを扱う場合同様の事が発生する可能性があるわけでして…
Androidの場合はそれが顕著になっている様子。(上限や設定値などは未調査)
ひとまずその解決法をアップ。
やる事は『画像をリサンプリング(再標本化)する』という事。
リサンプリングについてはここには詳しく記載しません。
(というより記載できません。詳しくは知らないので…
)雰囲気を感じ取れる程度のソースを以下に記載。
===========================================================================
// ①画像情報のみ取得
InputStream iStream = context.getContentResolver().openInputStream(uri);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
Bitmap bmp = iBitmapFactory.decodeStream(iStream, null, opt);
iStream.close();
iStream = null;
// ②取得した画像情報からリサンプル値を取得(変換後サイズを300とする)
int resample = 1 + (opt.outWidth/300);
// ③画像をリサンプリング
iStream = context.getContentResolver().openInputStream(uri);
opt.inSampleSize = resample;
opt.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeStream(iStream, null, opt);
===========================================================================
ポイントは上記ソース内のコメントの通りで全3工程で行う事。
①まずはリサンプル値を求めるために、画像情報を読み込む。
②その後、読みん込んだ値からリサンプル値を算出。
※上記例では実際の画像とリサンプル後の横幅の比率より値を算出しているが
必要であれば縦の比率も取得可能。
③最終的に算出したリサンプル値で画像を変換する。
こんな感じ








