BitmapFactory.Optionsを使ってメモリ節約

BitmapFactory.Optionsを使う方法は下記が分かりやすいです。

AndroidでBitmapFactoryを使ってサイズの大きな画像を読み込むサンプル

BitmapFactory.Options の使い方   の説明をちゃんとしたかったな…

上記の2つの記事だけ読めば大体の利用価値は分かるかと思いますが、

outofmemoryを回避する方法として利用をします。

 

ひとつは、サイズが大きすぎる事がある場合

options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
//options.outWidth
//options.outHeight

で横幅と縦幅が取得できます。

この関数に関しては個人的に利用したところ、画像の縦幅と横幅がステージのdencityに対応して変化しているようで、

DisplayMetrics metrics = new DisplayMetrics();  
context.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float _sd = metrics.scaledDensity;
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
//options.outWidth*_sd
//options.outHeight*_sd

とした方が正しいようでした。一応、密度などの変更もできるようなので、いろいろ試しながら利用してみるとよいかと思います。

これで、使いたい大きさより、大きかった場合には、

options.inSampleSize = 2;

と設定すれば、1/2の大きさで読み込みをしてくれますが。ここの値がintの為、3/4など微妙な値に対しては利用できないので、注意が必要です。

 

また、メモリ内に参照が残ってしまったりする場合

inPurgeableと言う値があるのだが、再利用性のないbitmapを解放してくれるらしいのだが、メモリ節約の為、基本的には、trueでいいかと思う。

options.inPurgeable=true;

 

また大きな部分として読み込む色を変更できる。

色の設定に関しては、inPreferredConfigで読み込む色を制限できる。

ALPHA_8:Alpha のみ
ARGB_4444:RGBAともに128色から
ARGB_8888:RGBAともに256色から
RGB_565:Alphaなし

上記でデフォルトがARGB_8888なのだが、ALPHAがない場合はRGB_565、色数が少ない場合はARGB_4444に変更すると格段にパフォーマンスがあがる。

 

他には、

inPreferQualityOverSpeed=true;

でスピードより品質を優先してレンダリングしてくれるらしいのだけど、スマホだとあまり必要ないかも。タブレットだと有用かも。

 

以上です。

 

前後の記事

前の記事:

次の記事:

関連の記事

コメント

:D 花奈

デコログのアプリつくってくださ~い

:D 匿名

>ARGB_4444:RGBAともに128色から
16色では……?

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑