如何使用Python和Pillow库批量调整图片尺寸并添加水印?
利用Pillow批量调整图片尺寸时应使用thumbnail()等比缩放,避免比例扭曲;文字水印需新建RGBA图层用alpha_composite()合成实现透明;批量处理建议使用pathlib和glob过滤文件;中文字体渲染需提前验证字体文件,否则会显示方框。
用Pillow批量处理图片确实能省不少事,但关键在于:你得清楚每个工具的特性,否则写出来的脚本要么比例扭曲,要么水印一团黑。下面把几个容易踩坑的地方拆开说。
#### 尺寸调整:别一上来就用`resize()`,`thumbnail()`才是正道
很多新手习惯直接调`resize()`硬拉尺寸,结果遇到宽高比不同的原图就惨了——人物被压扁,风景被拉长。实际上`thumbnail()`才是为批量缩放设计的:它原地等比缩略,只改大不改小,自动适配目标最大边长。比如:
- `img.thumbnail((800, 600), Image.Resampling.LANCZOS)` —— 缩到最长边不超过800px,宽高比完整保留
- 如果你非要统一输出800×600,缩完后再用`img.crop()`居中裁切,别去碰`resize()`的`box`参数,那东西容易把人绕晕
- 另外,批量处理时先执行`img.convert("RGB")`,否则一张RGBA的PNG图片直接在保存JPEG时会报`cannot write mode RGBA as JPEG`,这种错误排查起来特别烦
#### 文字水印:绕过`text()`的透明缺陷,用`Image.new()`+`alpha_composite()`
`ImageDraw.text()`渲染的文字没法直接设透明度,就算你把`fill`写成`(255,255,255,32)`,Pillow也会无视alpha通道。正确的做法是分两层画:
1. 先新建一个与原图同尺寸的RGBA图层作为水印层:`Image.new("RGBA", img.size)`
2. 在这个水印层上用`ImageDraw.Draw(watermark).text()`写字,`fill=(255,255,255,32)`里的32就是alpha值(范围0–255),这样就能控制透明度了
3. 然后把原图转成RGBA:`img.convert("RGBA")`,再用`Image.alpha_composite(img, watermark)`合成,最后转回RGB保存
4. 字体路径必须给绝对路径,`ImageFont.truetype()`不认识相对路径,也不认系统字体名(比如写"Arial"根本没用)
#### 批量循环:别再拿`os.listdir()`硬扫了,换成`pathlib.Path`+`glob()`
`os.listdir()`不过滤隐藏文件,也不区分文件类型,很容易把`.DS_Store`或者子目录当图片处理。改用`pathlib`不仅代码更干净,还能避免这些坑:
```python
from pathlib import Path
img_dir = Path("input")
for img_path in img_dir.glob("*.jpg"): # 或 **/*.png 支持子目录
if img_path.is_file():
with Image.open(img_path) as img:
# 处理逻辑...
img.sa ve(f"output/{img_path.stem}_wm.jpg")
```
- `glob("*.jpg")`自动过滤非JPG文件,`is_file()`排除目录
- 保存路径用`f"output/{img_path.stem}_wm.jpg"`,`stem`能去掉后缀,避免出现`photo.jpg_wm.jpg`这种双扩展名
- 务必用`with Image.open()`上下文管理,否则批量处理时文件句柄泄漏,跑着跑着就报错
真正麻烦的其实还是中文字体渲染——Pillow对中文支持很弱,`text()`遇到缺字不会报错,只会默默画一堆方框。千万不能只看字体文件名带个“simhei”就以为能用,必须提前验证字体文件是否包含你需要的那几个汉字。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













