pillow 生成缩略图的尺寸问题

内容纲要

背景

最近用 pillow 给图片生成缩略图,这样在列表展示图片时可以节省些流量,结果发现有少量图片的缩略图在特定的样式下,有些变形

pillow 生成缩略图

pillow 生成缩略图很简单,只需要 2 个参数:原始图片和缩略图的尺寸(宽度和高度),如下例

def thumbnail(content: bytes, size: tuple) -> bytes:
    """生成缩略图并返回二进制数组"""
    with Image.open(BytesIO(content)) as image:
        image.thumbnail(size)
        bio = BytesIO()
        image.save(bio, format='JPEG')
        return bio.getvalue()

我的列表页图片样式是固定宽度,高度可变但有最大值

{width: 280px;max-height: 360px;}

所以生成缩略图时传入的 size=(280, 420),当时也疑惑过,如果原始图片比例不是 280*420,会生成什么尺寸的缩略图呢?

经过实验发现,如果原始图片的比例和缩略图尺寸不一致,缩略图会满足宽度或者高度之一,但无法同时满足

  • 先满足宽度,然后等比例计算出高度
    • 如果高度不大于目标高度,则生成缩略图
    • 如果高度大于了目标高度,则满足高度,再等比例计算出宽度,生成缩略图

示例

# 宽 280,高 420
size = (280, 420)

源图为 1080*1280

w = 280
h = 280 / 1080 * 1280 = 332

332 < 420,缩略图最终尺寸为 280*332

源图为 720*1280

w = 280
h = 280 / 720 * 1280 = 498

498 > 420,那么缩略图的高只能是 420,重新计算

h = 420
w = 420 / 1280 * 720 = 236

236 < 280,缩略图最终尺寸为 236*420

结论

如果要确保生成的缩略图是某个宽度,那么 size 参数应该设置一个足够大的高度,确保等比例缩放后的缩略图高度不可能比这个高度大

pillow 生成缩略图的尺寸问题

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
粤ICP备2020114259号 粤公网安备44030402004258