1

まず、メモリ不足の例外に関する多くの投稿や記事を読みましたが、どれも私の状況に役立っていません。私がやろうとしているのは、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回実行する(新しいイメージを設定する)と、より多くの例外が発生するようです。ただし、このコードを再度実行する前に、ガベージコレクションを可能にするビットマップから作成されたドローアブルを必ずアンロードしてください。

助言がありますか?

ありがとう、ニック

4

2 に答える 2

2

あなたの場合、最初のデコードを実行した後に中間ビットマップを作成する必要はありません。キャンバスに描画しているので、次のいずれかの方法(最も便利な方法)を使用して、画像を最適なサイズに拡大縮小できます。

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)
于 2013-02-27T20:19:15.023 に答える
0

たぶん、この方法は役立つでしょう、私は自分でスタックオーバーフローからそれをやってのけたと思います。メモリ不足の例外の問題が解決しました。

private Bitmap decodeFile(File f){
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //The new size we want to scale to
        final int REQUIRED_SIZE=250;

        //Find the correct scale value. It should be the power of 2.
        int scale=1;
        while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
            scale*=2;

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}

    return null;
} 
于 2013-02-22T18:36:16.527 に答える