Как эффективно декодировать масштабированное растровое изображение из URL

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

Опция 1:

  1. Создайте буферизованный поток ввода из URL-адреса изображения
  2. Декодировать только границы
  3. Создать коэффициент масштабирования/размер выборки
  4. Создайте буферизованный входной поток (опять же, поскольку bitmapfactory закрывает поток после завершения декодирования)
  5. Декодировать растровое изображение

Вариант 2

  1. Создайте буферизованный поток ввода из URL-адреса изображения
  2. Декодируйте растровое изображение в исходном размере
  3. Используйте bitmap.createScaledBitmap для создания нужного размера.

В варианте 1 нам нужно загрузить растровое изображение дважды, тогда как в случае 2 мы должны явно переработать растровое изображение исходного размера, что вызовет сборку мусора, которая является интенсивной операцией ЦП.

Существуют ли какие-либо другие методы, которые могут эффективно достичь этого?


person Android_Learner    schedule 05.01.2020    source источник
comment
Другим вариантом является возврат сервером растрового изображения соответствующего размера (и обычно рекомендуется уменьшить время / размер передачи по сети - не у всех хорошая скорость сети).   -  person Morrison Chang    schedule 05.01.2020
comment
Серверная часть не под контролем. Приложение получает URL-адрес, который необходимо расшифровать.   -  person Android_Learner    schedule 05.01.2020
comment
With option 1, we need to download the bitmap twice .Нет. Сначала вы загружаете не растровое изображение, а файл. Скорее всего jpg файл. Затем, если вы декодируете границы, будет загружен только заголовок файла. Не весь файл. Заголовка достаточно для декодирования границ. Так что выбирайте вариант один.   -  person blackapps    schedule 05.01.2020


Ответы (2)


Вариант 3:

  1. Скачать файл в локальную файловую систему
  2. используйте вариант 1

пс. Вариант 2 в конечном итоге переполнит вашу память. Крайне не рекомендуется.

person lenik    schedule 05.01.2020

Попробуйте использовать inJustDecodeBounds. Установите его в TRUE и загрузите файл как есть.

Изображение не будет загружено в память. Но свойства outheight и outwidth BitmapFactory.Options будут содержать параметры фактического размера указанного изображения. Подсчитайте, сколько вы хотите подвыборки. например 1/2 или 1/4 или 1/8 и т. д. и назначьте 2/4/8 и т. д. соответственно inSampleSize.

Теперь установите для параметра JustDecodeBounds значение FALSE и вызовите BitmapFactory.decodeFile(), чтобы загрузить изображение точного размера, рассчитанного выше.

person haresh    schedule 05.01.2020
comment
Это именно вариант 1. Но это загрузит файл дважды. один раз для декодирования границ и один для декодирования файла - person Android_Learner; 05.01.2020
comment
Насколько мне известно, первый проход просто загрузит небольшую часть изображения - заголовок, из которого он будет считывать размеры. Настоящее декодирование загрузит все изображение. Так что я не думаю, что оно будет загружать изображение дважды. - person haresh; 05.01.2020