Изменение размера растрового изображения с помощью inSampleSize <2 или другим способом без использования OoM - PullRequest
1 голос
/ 12 июля 2011

У меня есть большие масштабируемые растровые изображения с текстом, которые я хочу немного изменить.Самый простой способ - использовать inSampleSize, но минимальное значение для его работы - 2, что недопустимо (изменение размера изображения пополам делает текст нечитаемым).

createScaledBitmap работает нормально, но из-за медленной сборки мусора в Androidдля растровых изображений я иногда запускаю OutOfMemory в следующих за ним методах (я вызываю createBitmap после декодирования).

Итак, мне интересно, есть ли способ уменьшить размер растрового изображения не вдвое и без проблем с памятью

1 Ответ

3 голосов
/ 12 июля 2011

Добро пожаловать в мой личный ад ...

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

Весь мой опыт работы с огромными растровыми изображениями приводит к одному решению: обрабатывать полный жизненный циклрастровое изображение самостоятельно.Не просто установите для растровой ссылки значение null, перезапустите ее, прежде чем выпускать ссылку.Также ловите возможную OOME и свободную память там.Очистите все и попробуйте последнее растровое декодирование снова.

У меня есть несколько вызовов, как это:

try {
    try {
        mBitmap = BitmapFactory.decodeFile(uri, mOptions);
    }
    catch (OutOfMemoryError e) {
        freeMemory();
        // retry
        mBitmap = BitmapFactory.decodeFile(uri, mOptions);
    }
}
catch (OutOfMemoryError e) {
    Log.e("THREAD", "FATAL OOME ..." + mPageNumber, e);
}
...