Pillow图像处理实战:缩放裁剪与文字水印脚本
Pillow 是 Python 生态中最知名的图像处理库之一,在 GitHub 上收获了 13,590 个 Star。它的历史可以追溯到 PIL:PIL 由 Fredrik Lundh 在上世纪 90 年代末创建,是 Python 最早的图像处理库,但后来长期无人维护;Jeffery “Alex” Clark 在 2010 年前后创建了 Pillow 这个友好分支,修复大量 Bug 并加入 Python 3 支持。如今 Pillow 由社区协作维护,已成为 PIL 的正式继任者。对脚本开发者而言,Pillow 的入口非常统一:打开图片返回 Image 实例,在实例上调用方法完成操作,最后 save 输出。整个流程不需要理解底层像素格式细节。安装方式也很直接:
pip install Pillow
虽然项目名是 Pillow,但代码中导入仍使用 PIL 包名,例如 from PIL import Image。下面先从最小图像处理流程开始。
一、打开图片、生成缩略图并保存
from PIL import Image
img = Image.open('photo.jpg')
img.thumbnail((800, 600))
img.save('thumbnail.jpg')
这段脚本中,Image.open 接收图片路径并返回 Image 对象;thumbnail 接收目标尺寸元组 (800, 600),用于生成缩略图,并保持原图宽高比;save 把处理结果写入 thumbnail.jpg。实际写批处理脚本时,可以把图片路径、输出目录和尺寸抽成参数,循环调用同一套方法。
二、添加文字水印
from PIL import Image, ImageDraw, ImageFont
img = Image.open('photo.jpg')
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('arial.ttf', 36)
draw.text((10, 10), 'Watermark', font=font, fill=(255, 255, 255, 128))
img.save('watermarked.jpg')
这里 ImageDraw.Draw 在 Image 对象上创建绘图对象;ImageFont.truetype 加载 TrueType 字体,第一个参数是字体文件路径,第二个参数是字号,示例为 36;draw.text 的第一个参数 (10, 10) 是文本左上角坐标,第二个参数是文本内容,font 指定字体对象,fill 指定颜色/透明度,示例使用 RGBA 四元组 (255, 255, 255, 128)。最后同样通过 save 输出 watermarked.jpg。
三、Pillow 的核心能力与 API 设计
Pillow 覆盖的图像处理场景很广,原文列出的能力包括:图像变换(缩放、旋转、翻转、裁剪、透视变换);颜色处理(RGB、RGBA、灰度、CMYK 等颜色空间互转,亮度对比度调整);滤镜与增强(模糊、锐化、边缘增强、浮雕、轮廓检测);像素级操作(逐像素读写、通道分离与合并、直方图均衡化);绘图接口(绘制文字并支持 TrueType 字体、线条、矩形、圆弧);动画处理(GIF 帧读取与合成、APNG 支持);元数据读写(读取和修改 EXIF、IPTC、XMP 等图片元信息);图像合成(图层叠加、透明度混合、图像拼接)。
这些能力都通过统一的 Image 对象暴露,API 风格一致,因此调用方式容易迁移:Image.open 打开,实例方法处理,save 输出。文件格式支持方面,JPEG、PNG、GIF、TIFF、BMP、WebP、ICO 这些常见格式自然不在话下,PSD、PCX、TGA 等专业格式也在支持范围内。高效的内部图像表示让它在处理大尺寸图片时仍能保持不错的性能。
在 Web 开发中,Pillow 出现频率很高。Django 的 ImageField 底层依赖 Pillow 处理上传图片的缩放和格式校验;Flask 和 FastAPI 项目中,用户头像裁剪、商品图缩略图生成、验证码图片合成,几行 Pillow 代码就能完成。对于需要上传图片、生成缩略图、加水印或做格式校验的后端接口,Pillow 通常是首选基础库。
四、项目质量与兼容性
Pillow 在工程质量上投入了大量精力。CI 系统覆盖 Linux、macOS、Windows 以及 MinGW 和 Docker 环境,每次提交都会触发完整的测试套件;代码覆盖率由 Codecov 持续追踪,还引入 OSS-Fuzz 进行模糊测试,以发现边界情况下的安全问题。项目维护获得 Tidelift、Thanks.dev 和 GitHub Sponsors 的资金支持,OpenSSF Best Practices 徽章也反映了项目在安全最佳实践方面的投入。
Pillow 经过近二十年演进,从 PIL 的兼容补丁成长为 Python 图像处理的基础设施。大多数 Python Web 框架的图像上传处理、数据分析库的图表渲染背后都有 Pillow 的身影。它的 API 保持了长期向后兼容,依赖它的项目可以放心升级。对于任何涉及图像处理的 Python 项目,Pillow 都是一个扎实的起点。
如果从脚本实践切入,建议先掌握 Image.open、thumbnail、save 以及 ImageDraw、ImageFont 这两组接口,再根据业务扩展到裁剪、颜色转换、元数据读写和图像合成。这样既能快速完成头像、缩略图、水印等常见需求,也能继续衔接 Django、Flask、FastAPI 等框架中的图片处理流程。
Re: Pillow图像处理实战:缩放裁剪与文字水印脚本
感谢分享,这篇把 Pillow 从最小流程到常见脚本场景讲得很顺,Image.open、thumbnail、save 和 ImageDraw、ImageFont 两组入口确实够用了。水印那段我有个实际踩坑点:示例 fill 用了 (255,255,255,128),如果原图是 RGB 再保存成 jpg,透明度一般不会保留,看起来还是不透明白字;想要半透明水印,最好在 RGBA 图上处理并输出 png,或者单独画到透明图层再合成。另外 arial.ttf 在 Linux 服务器上不一定存在,部署时得换成实际字体路径或做兜底。整体作为入门和脚本实战参考很实用,尤其是批处理缩略图和水印的思路。Re: Pillow图像处理实战:缩放裁剪与文字水印脚本
感谢整理,Pillow 这套 open、thumbnail、save 的流程确实清晰,水印那段把 ImageDraw 和 ImageFont 的关键点也讲到了。我准备先按这个顺序拿几张图练手,再试着把输入路径、输出目录、尺寸和水印文字做成参数,方便批量跑。想请教一下,如果原图是 JPEG 再画 RGBA 水印,保存时透明度一般会怎么处理?另外字体文件路径在不同系统上不太好统一,实际脚本里你通常怎么处理?内容很实用,收藏了。Re: Pillow图像处理实战:缩放裁剪与文字水印脚本
感谢楼主分享,这篇总结挺扎实的。把 Pillow 和 PIL 的渊源、安装导入的差异,以及最小处理流程讲得很顺,对刚接触的人很友好。尤其 thumbnail 会自动保持宽高比这点,和 save 输出这类统一入口,确实很适合拿来写批处理脚本。水印部分用 ImageDraw、ImageFont 和 draw.text,连 fill 的 RGBA 透明度都点到了,照着写就能落地。后面列的核心能力和 Web 场景也让我更清楚 Pillow 适合放在哪一层。按文中说的把图片路径、输出目录和尺寸抽成参数循环处理,应该能很快做成头像、缩略图和水印的小工具。感谢整理。
页:
[1]