Как уменьшить изображение только в том случае, если оно больше запрошенного размера в Glide?

#android #picasso #android-glide

Вопрос:

Я использую Picasso с давних пор. Сегодня я перехожу на Glide. В Picasso я использовал следующий шаблон загрузки:

 Picasso.get()
    .load(file)
    .resize(targetSize, 0)
    .onlyScaleDown()
    .placeholder(R.color.default_surface)
    .error(R.color.default_surface_error)
    .into(imageView)
 

В соответствии с документацией resize(int, int),

Используйте 0 в качестве желаемого размера для изменения размера с сохранением соотношения сторон

Согласно документации onlyScaleDown(),

Изменение размера изображения возможно только в том случае, если размер исходного изображения больше целевого размера, указанного с помощью resize(int, int)

Вот что я пытаюсь:

 Glide.with(imageView)
    .log(this, thumbnailUrl?.toString())
    .load(thumbnailUrl)
    .override(600)
    .placeholder(R.color.default_surface)
    .error(R.color.default_surface_error)
    .into(imageView)
 

Glide использует стратегию понижающей дискретизации по умолчанию при загрузке изображений с использованием DownsampleStrategy.ЦЕНТР_ СНАРУЖИ. В нем говорится, что изображение масштабируется в соответствии с переопределенным размером таким образом, чтобы одно из измерений (наименьшее?) Было равно переопределенному размеру. И следующий комментарий:

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

Этот метод увеличит масштаб, если запрошенные ширина и высота будут больше, чем исходные ширина и высота. Чтобы избежать увеличения масштаба, используйте {@link #AT_LEAST}, {@link #AT_MOST} или {@link #CENTER_INSIDE} .

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

Ответ №1:

Я нашел ответ в выпуске Github # 3215, где предлагается следующее:

Выберите полезную стратегию уменьшения выборки, в частности, CENTER_INSIDE может быть тем, что вы ищете. По умолчанию DownsampleStrategy масштабируется для максимального увеличения повторного использования растрового изображения, но обычно доступна эквивалентная стратегия, которая не будет масштабироваться.

И DownsampleStrategy.CENTER_INSIDE это соответствует тому, что я хотел:

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

Меня смутила документация по DownsampleStrategy.CENTER_INSIDE в коде.