Используя Glide, возможно ли получить разрешение выходного изображения до фактического декодирования и сохранения в растровое изображение? - PullRequest
0 голосов
/ 01 января 2019

Фон

Я пытаюсь создать эффект горизонтальной прокрутки для любого файла изображения в приложении для живых обоев.

Для этого мне нужно работать в соответствии с этими правилами, я думаю:

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

Проблема

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

То, что я пробовал

Я пытался возиться с различными преобразованиями (пример: centerCropTransform, fitCenterTransform), но ни один из них не достиг того, чего я хотел, поэтому я думаю, что никто не сможет работать, если я не сделаю сомСпециальная математика на моей стороне, прежде чем решить, что делать с Glide.

В настоящее время я делаю что-то вроде этого:

val result = Glide.with(context).asBitmap()
                           .load(imageFile)
                           .apply(RequestOptions.noTransformation()
                           .skipMemoryCache(true)
                           .diskCacheStrategy(DiskCacheStrategy.NONE))
                           .submit(reqWidth, reqHeight).get()

Это работает, как и производит (по крайней мере, в соответствии с моимтесты) растровое изображение, по крайней мере, того размера, который я запрашиваю.Однако это означает, что у меня есть дополнительные пиксели, которые на самом деле не нужны для высоты.Это также не защищает меня от создания слишком большого растрового изображения.

Но я думаю, может быть, было бы проще попросить Glide использовать различные методы для вышеуказанной цели, а затем принять решение о возможных выходных разрешениях, которыеЛучше всего использовать.

Вопросы

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

  2. Возможно, есть лучший вариант, который я должен рассмотреть?Может быть, сделать расчет на моей стороне, а затем решить, что делать с Glide?Если да, то как?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

ОК, я думаю, что получил.

Я рассчитываю, что произойдет, если я подгонюсь к ширине и высоте, и соответственно использую центральную обрезку для вычисленного результата:

                    val bitmapOptions = Utils.getBitmapOptions(savedImageFileForWallpaperBackground.absolutePath)
                    //newWidth/newHeight=oldWidth/oldHeight
                    val widthIfScaledToHeight = reqHeight * bitmapOptions.outWidth / bitmapOptions.outHeight
                    val heightIfScaledToWidth = reqWidth * bitmapOptions.outHeight / bitmapOptions.outWidth

                    val result: Bitmap
                    if (widthIfScaledToHeight >= reqWidth) {
                        result = Glide.with(wallpaperService).asBitmap()
                                .load(savedImageFileForWallpaperBackground)
                                .apply(RequestOptions.centerCropTransform().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE))
                                .submit(widthIfScaledToHeight, reqHeight).get()
                    } else {
                        result = Glide.with(wallpaperService).asBitmap()
                                .load(savedImageFileForWallpaperBackground)
                                .apply(RequestOptions.centerCropTransform().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE))
                                .submit(reqWidth, heightIfScaledToWidth).get()
                    }
0 голосов
/ 01 января 2019
  • Я должен масштабировать / обрезать так, чтобы высота имела определенное значение.
  • Ширина должна быть не меньше определенного значения
  • Сохранить аспектсоотношение независимо от того, что.

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

Я бы рекомендовал вместо этого использовать эти три условия:

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

Glide может сделать 1 и 3 для вас, но 2 вам может понадобиться сначала декодироватьрастровое изображение без выделения памяти (посмотрите BitmapFactory.Options.inJustDecodeBounds), чтобы получить соотношение сторон источника, затем используйте математические вычисления, чтобы выяснить, какую высоту и ширину установить, чтобы не превышать потолок памяти для каждого растрового изображения.

И последнее, хотя, в зависимости от вашего варианта использования (если вам нужно визуализировать несколько растровых изображений за короткий промежуток времени), вы можете рассмотреть возможность обрезки до стандартного выходного соотношения сторон, чтобы вы могли воспользоваться преимуществом функции переработки растровых изображений Glide, что помогает избежать сбоев OOM.

...