При обрезании большого изображения выходит ошибка

Рейтинг: -2Ответов: 1Опубликовано: 05.05.2015

При обрезании большого изображения выходит ошибка java.lang.OutOfMemoryError, если делаю фотографию передней камерой размер фото получается 1920 на 1080, и его она обрезает нормально, но если фото сделать задней камерой фото выходит размера 5312 на 2988 и размер 3 с лишним мегабайт. в чем может быть проблема или как можно обойти это

bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth() / 2 - bitmap.getHeight() / 2, 0, bitmap.getHeight(), bitmap.getHeight());


Process: kz.tanikin.photo365, PID: 31019
java.lang.OutOfMemoryError: Failed to allocate a 35712588 byte allocation with 16777216 free bytes and 29MB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.Bitmap.nativeCreate(Native Method)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:939)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:912)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:832)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:757)

Ответы

▲ 4Принят

Память не резиновая. 35712588 байтов вам не разрешит выделить (почти) никакая AndroidJVM. загружайте уже уменьшенные изображения.

//считываем свойства битмапа, не загружая его в память   
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(<путь к файлу>, options);
options.inSampleSize = calculateInSampleSize(options, <мин. требуемая ширина>, <мин. требуемая высота>);
options.inJustDecodeBounds = false;

Bitmap scaledBitmap = BitmapFactory.decodeFile(<путь к файлу>, options);
//готово! в scaledBitmap теперь загружена уже проресайзеная картинка. 


// этот метод посчитает коейфициент, во сколько раз уменьшить исходную картинку
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;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

И, да, опять. Вы сами пробовали решить проблему, или сразу пытаетесь мне на голову залезть? https://www.google.com.ua/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#safe=off&q=android%20bitmapfactory.decodefile%20outofmemoryerror