Как найти размер изображения, который не будет вызывать исключение OutOfMemoryException в Android? - PullRequest
0 голосов
/ 15 декабря 2018

Мое приложение снимает изображение с помощью камеры устройства, а затем открывает его, чтобы пользователь мог выполнить некоторую обработку.Для этого я проверяю ориентацию изображения и при необходимости поворачиваю его, что я делаю так:

       Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), lastTaken);
        int rotation = getCameraPhotoOrientation(filePath);
        if (0 < rotation)
        {
            Matrix mx = new Matrix();
            mx.setRotate((float) rotation);
            image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), mx, true);
        }

Этот код работает на большинстве устройств, однако на одном из старых тестовых устройств, которые я использовал, онвызывает OutOfMemoryException, когда изображение поворачивается, предположительно потому, что оно пытается удержать две копии изображения в памяти.

Как я могу избежать этого?

Если не существует простого способа предотвратить проблему на данном этапе процесса, есть ли способ, которым я могу проверить, сколько памяти у меня есть, и ограничить разрешение изображения, которое использует камера, таким, чтобыоставит достаточно места для этой операции?Я уже указываю разрешение, поэтому вопрос в том, как сравнить размер изображения и доступную память, чтобы определить, какое разрешение будет безопасным.Мое единственное ограничение заключается в том, что изменения, которые вносит пользователь, должны относиться к исходному изображению, поэтому редактирование уменьшенной копии изображения не обрезает его, если нет простого способа отразить эти изменения в сохраненной версии.Следовательно, уменьшение размера изображения до уровня, который может поддерживаться в памяти, никоим образом не будет катастрофой.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Я не смог найти способ выяснить объем доступной памяти и сколько мне понадобится, но после поиска некоторых других вопросов по этой теме я обнаружил, что лучшим решением для меня было бывключите элемент largeHeap в манифесте приложения - это решило проблему для меня, хотя это не ответило на вопрос, и после дальнейшего прочтения я подозреваю, что не существует удовлетворительного способа сделать это в существующем состоянии.

0 голосов
/ 15 декабря 2018

Каков размер вашего изображения?Вы проверяли возможные утечки памяти в приложении?

В любом случае, одним из способов является попытка повторно использовать память, выделенную для первого растрового изображения, после создания нового второго растрового содержимого.В соответствии с документами по Android здесь - https://developer.android.com/topic/performance/graphics/manage-memory,

Android 3.0 (уровень API 11) представляет поле BitmapFactory.Options.inBitmap.Если эта опция установлена, методы декодирования, которые принимают объект Options, будут пытаться повторно использовать существующее растровое изображение при загрузке контента.Это означает, что память растрового изображения используется повторно, что приводит к повышению производительности и устранению как выделения, так и перераспределения памяти.

Вы можете настроить Растровое изображение для повторного использования приновый растр создан.

...