Python 批量生成缩略图:网站列表页快速预览图教程
用 Python Pillow 批量给大图生成小尺寸缩略图,按最长边限制、自动等比缩放、保留原图,适合网站相册、商品列表、文件管理器预览。
场景痛点
做相册站、商品列表、文件管理系统,列表页要显示一堆小预览图。直接在浏览器加载原图一张几 MB,列表页打开慢到怀疑人生。正确做法是提前批量生成一张几百像素的缩略图,列表页只加载缩略图,点开才看原图。用 Python 跑一遍,原图不动,缩略图单独输出一个目录。
用到的库
pip install Pillow
完整代码
import os
from PIL import Image
SRC_EXTS = (".jpg", ".jpeg", ".png", ".webp")
def make_thumbnail(src_path, dst_path, max_size=300):
"""生成最长边不超过 max_size 的缩略图,等比缩放"""
with Image.open(src_path) as img:
# thumbnail 原地修改,最长边缩到 max_size,保持宽高比
img.thumbnail((max_size, max_size), Image.LANCZOS)
# 存 JPEG 时透明图先转 RGB
if img.mode in ("RGBA", "P"):
img = img.convert("RGB")
ext = os.path.splitext(dst_path)[1].lower()
if ext in (".jpg", ".jpeg"):
img.save(dst_path, "JPEG", quality=85, optimize=True)
else:
img.save(dst_path)
return img.size
def batch_thumbnail(src_dir, dst_dir, max_size=300, suffix="_thumb"):
"""批量生成缩略图,输出到 dst_dir,文件名加后缀"""
os.makedirs(dst_dir, exist_ok=True)
for root, _, files in os.walk(src_dir):
for name in files:
if not name.lower().endswith(SRC_EXTS):
continue
src_path = os.path.join(root, name)
stem, ext = os.path.splitext(name)
dst_name = f"{stem}{suffix}.jpg" # 缩略图统一存 jpg
rel = os.path.relpath(src_path, src_dir)
dst_path = os.path.join(dst_dir, os.path.dirname(rel), dst_name)
os.makedirs(os.path.dirname(dst_path), exist_ok=True)
try:
size = make_thumbnail(src_path, dst_path, max_size)
print(f"已生成:{dst_path} 尺寸 {size}")
except Exception as e:
print(f"失败:{src_path},原因:{e}")
def main():
batch_thumbnail("./photos", "./photos_thumbs", max_size=300)
if __name__ == "__main__":
main()
代码讲解
Image.thumbnail((w,h))是 Pillow 专门做缩略图的方法,自动按比例缩放到不超过给定框,比手动算比例方便。它是原地修改,直接作用在原 Image 对象上。- 第二个参数
Image.LANCZOS保证缩出来的小图清晰,不模糊。 thumbnail只会缩小不会放大,原图比 max_size 小就保持原样,符合"缩略图只压小不放大"的直觉。- 输出统一存成 JPEG,比 PNG 小很多,列表页加载快;透明 PNG 先
convert("RGB")再存。 - 文件名加
_thumb后缀,和原图同名同目录结构,前端引用时拼路径就行。
运行结果
运行后在 ./photos_thumbs 下生成和原图同目录结构的小图,每张最长边 300 像素,横图变成 300x200,竖图变成 200x300,文件大小通常在 10-30KB。控制台打印每张缩略图实际尺寸。
注意事项
thumbnail是原地操作,会改原 Image 对象,所以代码里用with Image.open()上下文管理器,作用域结束自动关闭。- 列表页常用尺寸是 200-400 像素,按页面设计调 max_size,太大失去缩略图意义,太小看不清。
- 想做正方形裁剪(中间裁一块)不能用 thumbnail,得先 resize 再 crop,单独写函数。
- 缩略图质量 quality=85 够用,列表页不需要极致清晰。
- 原图保留在原目录,脚本只读不写。

更新时间:2026-09-14 20:43:38
上一篇:Python 批量提取图片 EXIF 信息:拍摄时间相机型号 GPS 教程