まず、メモリ不足の例外に関する多くの投稿や記事を読みましたが、どれも私の状況に役立っていません。私がやろうとしているのは、SDカードから画像をロードしますが、正確なピクセルサイズに拡大縮小します。
まず、画像の幅と高さを取得し、サンプルサイズを計算します。
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(backgroundPath, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, getWidth(), getHeight());
サンプルサイズを取得する方法は次のとおりです(実際には関係ありませんが)。
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
// NOTE: we could use Math.floor here for potential better image quality
// however, this also results in more out of memory issues
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;
}
サンプルサイズがわかったので、ディスクからおおよそのサイズ(サンプルサイズ)に画像をロードします。
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPurgeable = true;
Bitmap bmp = BitmapFactory.decodeFile(backgroundPath, options);
次に、作成したこのビットマップを必要な正確なサイズにスケーリングしてクリーンアップします。
// scale the bitmap to the exact size we need
Bitmap editedBmp = Bitmap.createScaledBitmap(bmp, (int) (width * scaleFactor), (int) (height * scaleFactor), true);
// clean up first bitmap
bmp.recycle();
bmp = null;
System.gc(); // I know you shouldnt do this, but I'm desperate
上記の手順は通常、メモリ不足の例外を取得することです。上記のように2つの別々のビットマップを作成する必要をなくすために、ディスクから正確なサイズのビットマップをロードする方法を知っている人はいますか?
また、ユーザーがこのコードを2回実行する(新しいイメージを設定する)と、より多くの例外が発生するようです。ただし、このコードを再度実行する前に、ガベージコレクションを可能にするビットマップから作成されたドローアブルを必ずアンロードしてください。
助言がありますか?
ありがとう、ニック