Если вы имеете дело с растровыми изображениями, снятыми с камеры, вам нужно , чтобы быть очень осторожным с размером изображений.
Снимок, сделанный камерой, может быть довольно большим.Когда вы открываете изображение как растровое изображение, вы загружаете полный массив в память.Рассмотрим Nexus One с 5-мегапиксельной камерой.Пользовательские снимки, сделанные с помощью устройства, могут быть размером 2048x1536.Используя глубину пикселя 24 бит, мы говорим о почти 9 МБ.Это огромный , если принять во внимание ограничение кучи в 16/24 МБ.
Решение заключается в работе с меньшим размером, обычно вам не нужно полноразмерное изображение, поскольку устройство будетимеет гораздо более низкое разрешение, плюс размер вашей ImageView
(или любой другой поверхности, которую вы используете для отображения растрового изображения) обычно не занимает весь экран.
BitmapFactory.decodeByteArray(...)
(и другие фабричные методы) может принимать объект BitmapFactory.Options
, где вы можете указать масштабный коэффициент через inSampleSize
.Это не влияет на исходные данные, поэтому вы можете сохранить свое полноразмерное изображение и получить сэмпл растрового изображения в памяти.Вы можете комбинировать это, предварительно используя inJustDecodeBounds = true
, чтобы прочитать размер изображения, затем рассчитать масштабный коэффициент на основе размера изображения и размера вашего окна просмотра и, наконец, получить масштабированное растровое изображение.
ЭтоВопрос может быть полезен (не выбранный ответ, но два других с высоким баллом): Странно нехватка памяти при загрузке изображения в растровый объект
Редактировать: упс, опубликовано неправильноссылка на вопрос