2011年11月7日月曜日

画像を画面サイズに合わせる(縮尺・縮小する)【android】【画像表示】【エラー】

以前の投稿の続きです。↓
⇒java.lang.OutOfMemoryError: bitmap size exceeds VM budget【android】【画像表示】【エラー】 の続き


画像の表示について追記します。

以前、画像の縮小について下記の方法を書きましたが、

// 画像を1/20サイズに縮小(メモリ対策)
bmfOptions.inSampleSize = 20;


実際、表示されるすべての画像を均一に縮小するやり方はよくないということで、
画面の表示サイズを取得し、そこから必要に応じて縮小するやり方を紹介します。
以前紹介した、etBitmap(File file)を下記に変更してみました。
改善点等ございましたら、ご教授くださいませ。

    public Bitmap setBitmap(File file){
// ビットマップ作成オブジェクトの設定
BitmapFactory.Options bmfOptions = new BitmapFactory.Options();
// RGBでそれぞれ 5/6/5 ビットの色を使用(メモリ対策)
bmfOptions.inPreferredConfig = Config.RGB_565;
// GridViewの要素が横に3つ並ぶ想定で、余白も考慮し、画像の縮尺サイズを1/4に設定
// 画面のサイズに縮尺した後に、1/4にさらに縮尺
int reductionSize = Const.COLUMN_IMAGE_GRID_VIEW + 1;

if (metrics == null) {
// 現在の表示メトリクスの取得
DisplayMetrics dm = this.getResources().getDisplayMetrics();
// ビットマップのサイズを現在の表示メトリクスに合わせる(メモリ対策)
bmfOptions.inDensity = dm.densityDpi;
}
// システムメモリ上に再利用性の無いオブジェクトがある場合に勝手に解放(メモリ対策)
bmfOptions.inPurgeable = true;
// システム側で設定されているピクセル密度を無視して設定値を元に画像がスケール
bmfOptions.inScreenDensity = DisplayMetrics.DENSITY_LOW;

// 画像ファイルオブジェクトとビットマップ作成オブジェクトから、ビットマップオブジェクト作成
Bitmap bmImage = BitmapFactory.decodeFile(file.getPath(),bmfOptions);

if (metrics != null) {
float imageWidth = (float)bmImage.getWidth() / (float)metrics.widthPixels;
float imageHeight = (float)bmImage.getHeight() / (float)metrics.heightPixels;
float imageScale = Math.max(imageWidth, imageHeight);
if (imageScale > (1 / reductionSize)){
int newImageWidth = (int)((bmImage.getWidth() / imageScale) / reductionSize);
int newImageHeight = (int)((bmImage.getHeight() / imageScale) / reductionSize);
bmImage = Bitmap.createScaledBitmap(bmImage,newImageWidth,newImageHeight,false);
}else{
bmImage = Bitmap.createScaledBitmap(bmImage,bmImage.getWidth(),bmImage.getHeight(),false);
}
}
return bmImage;
}




【クラス変数宣言】
private DisplayMetrics metrics;


【onCreateメソッドで】
metrics = new DisplayMetrics();
display.getMetrics(metrics);




と、こんな感じです。
Const.COLUMN_IMAGE_GRID_VIEWは画面に表示している画像の列数です。
私のアプリでは、画像が3列表示されているので、余白も考え、
画面のサイズ/4 のサイズに縮小しています。
画面いっぱいいっぱいのサイズなら、reductionSizeを1にするとよいでしょう。

如何でしょうか?やっつけで作ったので、ちょっと不安ですが、
一応、今のところ、元気に動いているようですw

0 件のコメント:

コメントを投稿