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 输出。整个流程不需要理解底层像素格式细节。安装方式也很直接:
虽然项目名是 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 等框架中的图片处理流程。 |