Python 使用 Pillow 批量生成指定尺寸缩略图的方法与代码
本文详细介绍如何利用 Python 的 Pillow 图像处理库编写自动化脚本,将任意尺寸原图居中裁剪为等宽高正方形,并按预设参数批量缩放生成指定尺寸的缩略图。内容涵盖透明背景融合、边界框计算逻辑及高质量重采样配置,附带可直接运行的完整函数代码。
实现原理与核心逻辑
在实际的 Web 展示或应用开发中,直接将高分辨率原图缩放往往会破坏长宽比,导致画面拉伸或两侧留白。为保证视觉一致性,标准做法是先截取原图的中心正方形区域,再进行等比例缩放。该方案同时解决了 JPEG 格式不支持透明通道的问题,并支持一次性输出多种常用尺寸。
第1步:解析文件路径与加载图像
目的:安全分离原始文件名与扩展名,并成功读取图像数据。
入口:调用 import os 与 from PIL import Image。
动作:使用 os.path.splitext(path) 拆分路径,得到不带扩展名的基础名称。通过 Image.open(path) 实例化图像对象。务必使用 try...except IOError 包裹,以防止损坏文件或路径错误导致脚本中断。
第2步:色彩模式转换与透明背景处理
目的:消除非 RGB 模式带来的渲染异常,并为 PNG 透明图层填充实色背景。
入口:读取 im.mode 属性。
动作:若模式为 'L' 或 'RGB' 则跳过。针对 'RGBA' 类型,提取 Alpha 通道作为掩膜(alpha.point(lambda x: 255-x)),将其转为 'RGB' 后调用 im.paste((255,255,255), None, bgmask) 覆盖半透明区域为纯白底。其他非常规模式(如 P、LA 等)统一强制转换为 'RGB'。
第3步:等比居中裁剪正方形区域
目的:消除原始图像的长宽差异,构建标准的正方形画布供后续缩放。
入口:width, height = im.size。
动作:判断长宽是否相等。若不相等,计算偏移量 delta。当宽度大于高度时,边界框为 (delta, 0, delta+height, height);反之则为 (0, delta, width, delta+width)。调用 im.crop(box) 精准提取中心区域赋值给 region。
第4步:循环生成多尺寸缩略图
目的:按用户指定的像素序列,依次输出成品文件并控制压缩质量。
入口:函数参数 sizes=(75, 32, 16)。
动作:遍历尺寸列表。拼接输出文件名(格式如 原文件名_75x75.jpg)。调用 region.resize((size, size), Image.Resampling.LANCZOS) 执行高质量降采样。最后通过 thumb.save(filename, quality=100) 导出 JPEG 文件,显式设定质量参数以保留更多细节(JPEG 默认通常为 75)。
完整代码实现
import os
from PIL import Image
def MakeThumb(path, sizes=(75, 32, 16)):
"""
缩略图生成程序
sizes 参数传递要生成的尺寸元组,可一次性生成多种规格
"""
base, ext = os.path.splitext(path)
try:
im = Image.open(path)
except IOError:
return
mode = im.mode
if mode not in ('L', 'RGB'):
if mode == 'RGBA':
# 透明图片需要加白色底
alpha = im.split()[3]
bgmask = alpha.point(lambda x: 255 - x)
im = im.convert('RGB')
im.paste((255, 255, 255), None, bgmask)
else:
im = im.convert('RGB')
width, height = im.size
if width == height:
region = im
else:
if width > height:
delta = (width - height) / 2
box = (delta, 0, int(delta + height), height)
else:
delta = (height - width) / 2
box = (0, delta, width, int(delta + width))
region = im.crop(box)
for size in sizes:
filename = base + "_" + "%sx%s" % (size, size) + ".jpg"
thumb = region.resize((size, size), Image.Resampling.LANCZOS)
thumb.save(filename, quality=100)
关键注意事项
- 在处理高分辨率源文件前,建议先复制备份,以免批量操作失误影响原件。
- 代码中的坐标计算使用了
int()取整,避免浮点数边界导致裁剪越界报错。 - 当前逻辑固定输出
.jpg格式。若需保持原图格式,可将".jpg"替换为ext.lower()并移除quality参数。
以上就是 Python 使用 Pillow 批量生成指定尺寸缩略图方法的详细内容,更多关于 Python 图像处理与自动化办公的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









