Обходной путь выделения памяти Java

1

Я пытаюсь написать программу для платформы Android, где я много разбираюсь с изображениями. Рассмотрим следующее:

Bitmap b = BitmapFactory.decodeFile(File imagePath) // 5mb picture is stored into memory as with 32bits of memory per pixel --> almost run out of memory

Я хочу изменить пиксели в этом растровом изображении, но по какой-то причине битмап вернулся неизменен. Я решил, что сделать копию его с помощью b.copy(Config config, boolean isMutable) будет делать трюк, хотя я нахожусь в RuntimeExeception, говоря, что виртуальная машина не позволит нам выделять бла-бла-байты памяти. Мой вопрос заключается в следующем:

Bitmap mutable = BitmapFactory.decodeFile(File imagePath).copy(config, true);

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

Теги:
bitmap

2 ответа

2
Лучший ответ

Нет. Метод копирования имеет ссылку на неизменяемое растровое изображение при копировании его на изменчивое. Эта ссылка называется this. Таким образом, вы все еще имеете ссылку на оба растровых изображения одновременно.

Объект Options который вы можете передать методу decodeFile decodeFile имеет параметр inMutable, хотя это позволит полностью избежать неизменяемого растрового изображения.

  • 0
    Ах, я искал этот флаг inMutable, хорошая находка.
  • 0
    Я должен использовать более низкий уровень API, потому что в моих объектах BitmapFactory.Option нет опции inMutable. Но спасибо за это :)
Показать ещё 1 комментарий
0

Второй случай может работать, потому что это позволяет быстро очистить ссылку на первый битмап, хотя кажется, что он не должен работать, поскольку обе ссылки остаются в то же время неподвижными. Тем не менее, 5-мегабайтное изображение похоже на то, что оно подталкивает его (какое разрешение?). Помните, что память, доступная для приложения, сильно варьируется (в основном зависит от разрешения экрана конкретного устройства), поэтому все, что вы делаете, вероятно, не будет работать на другом меньшем устройстве. Итак, реальный вопрос: вам действительно нужен полноразмерный растровый рисунок?

  • 0
    Я хотел бы, чтобы пользователь мог увеличивать / уменьшать изображение, так что да, я хотел бы отобразить полноразмерное растровое изображение. Также мне нужно применить некоторые фильтры к пикселям, а затем установить их обратно. Спасибо за ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню