如果图像大于 Glide 中请求的大小,如何仅按比例缩小图像?

Posted

技术标签:

【中文标题】如果图像大于 Glide 中请求的大小,如何仅按比例缩小图像?【英文标题】:How to only scale-down an image if it is larger than requested size in Glide? 【发布时间】:2021-12-27 05:56:02 【问题描述】:

我已经使用毕加索很久了。今天,我正在迁移到 Glide。在毕加索,我曾经使用以下加载模式:

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.CENTER_OUTSIDE 加载图像时使用默认的下采样策略。它说图像被放大以匹配覆盖的大小,使得其中一个维度(最小?)等于覆盖的大小。并且,以下评论:

缩放,保持原始纵横比,使图像的一个尺寸正好等于请求的尺寸,而另一个尺寸大于或等于请求的尺寸。

如果请求的宽度和高度大于源宽度和高度,此方法将放大。为避免升级,请使用 @link #AT_LEAST、@link #AT_MOST 或 @link #CENTER_INSIDE。

DownsampleStrategy.java 中的选项让我很困惑。我不知道我应该使用哪一个。我希望大图像缩小到覆盖的大小,而小图像永远不要放大。如何在 Glide 中实现这一点?

【问题讨论】:

【参考方案1】:

我在Github Issue #3215 找到了答案,建议如下:

选择一个有用的DownsampleStrategy,特别是CENTER_INSIDE 可能是你要找的。默认的DownsampleStrategy 将放大以最大限度地重复使用位图,但通常有一个等效的策略不会放大。

而且,DownsampleStrategy.CENTER_INSIDE 符合我的要求:

如果小于目标,则返回原始图像,否则将在保持其原始纵横比的情况下进行缩小,这样图像的一个尺寸正好等于请求的尺寸,另一个小于或等于请求的尺寸尺寸。如果请求的尺寸大于原始尺寸,则不会放大。

我对代码中DownsampleStrategy.CENTER_INSIDE 的文档感到困惑。

【讨论】:

以上是关于如果图像大于 Glide 中请求的大小,如何仅按比例缩小图像?的主要内容,如果未能解决你的问题,请参考以下文章

Glide系列之缓存策略

如何在我的应用中使用 Glide 加载图像?

Glide 是不是对每个图像请求进行排队?滚动时Recyclerview加载非常慢

如果上传的图像大于指定大小,需要向 CMS 作者显示通知消息

有没有办法将图像作为位图加载到 Glide

图片不拉伸、不改变view大小的前提下,解决空白问题