0

約 4.19 MB (ディスクのサイズ) の画像 (3648x2736) があり、それをアプリケーションにロードしたかったのですが、十分なメモリがないためにクラッシュしました。したがって、この種のクラッシュを回避するために、画像をデコードする前にバリデーターを配置します (いいえ、サイズを小さくするために使用したくありませんinSampleSize)。

    long maxMemory = Runtime.getRuntime().maxMemory();
    long nativeUsage = Debug.getNativeHeapAllocatedSize();
    long heapSize = Runtime.getRuntime().totalMemory();
    long heapRemaining = Runtime.getRuntime().freeMemory();
    long memoryLeft = maxMemory - (heapSize - heapRemaining) - nativeUsage;


    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);
    int bitmapSize = options.outHeight * options.outWidth * 4;

    if (bitmapSize < memoryLeft)
        return BitmapFactory.decodeFile(filePath);

ここで確認したいことの 1 つは、bitmapSize正しく計算できているかどうかです。画像ファイルのサイズが 4.19 MB しかなくmemoryLeft、8 MB を超えていたため、アプリがクラッシュしました。つまり、すべてのピクセルを 4 バイト (PNG) として保存していますよね? jpegの場合は3バイトではないでしょうか?または、他に知っておくべきことがありますか?

4

1 に答える 1