python pillow

张开发
2026/4/13 15:55:38 15 分钟阅读

分享文章

python pillow
## 关于Python Pillow你可能需要知道这些在Python的世界里处理图片Pillow几乎是一个绕不开的名字。它不像那些庞大的深度学习框架那样引人注目也不像Web框架那样天天被挂在嘴边但当你需要打开一张图、调整一下尺寸、或者转换个格式的时候它总是那个最顺手、最可靠的工具。很多开发者甚至意识不到自己在用它因为它已经自然地融入了日常的工作流里。它到底是什么简单来说Pillow是一个用来处理图片的Python库。它的前身是PIL也就是Python Imaging Library。PIL项目在2011年就停止更新了后来一群热心的开发者接手过来维护并发展成了今天的Pillow。你可以把它理解为一个“友好版”的PIL修复了原版的一些问题支持了更新的Python版本用起来也更顺手。它不是一个独立的软件而是一套工具让你能在Python脚本里轻松地对图片进行各种操作。从打开一张手机拍的照片到生成一张复杂的合成图背后可能都有Pillow在默默工作。它能帮你解决什么问题Pillow能干的事情基本上涵盖了图片处理的常见需求。比如最常见的调整图片大小你拍了一张高清大图想发朋友圈直接用原图可能太大用Pillow几行代码就能缩放到合适的尺寸。再比如格式转换把一堆PNG图片转成JPG或者反过来这种批量操作对它来说是小菜一碟。它还能进行一些基本的图片编辑比如裁剪掉不需要的部分旋转图片摆正方向或者调整一下亮度、对比度。更进阶一点的比如把多张图片拼贴在一起给图片加上文字水印或者提取图片的一些基本信息像尺寸、颜色模式这些。虽然它不像专业的Photoshop那样有复杂的滤镜和图层功能但对于程序化、自动化的图片处理任务它的能力是绰绰有余的。很多Web应用也在用Pillow。用户上传头像后后台自动生成不同尺寸的缩略图内容管理系统里自动为文章里的图片添加网站Logo水印甚至是一些简单的验证码图片生成背后都可能用到了Pillow。上手使用的基本思路用Pillow通常是从打开一张图片开始的。这很简单从PIL模块里导入Image类然后用它的open方法传入图片文件的路径就行。这时你得到一个Image对象后续所有的操作都基于这个对象进行。想看看图片的尺寸访问一下size属性就知道了它会返回一个宽度高度的元组。觉得图片太大了想缩小一半可以用resize方法传一个新的尺寸元组过去就能得到一张新图。这里有个细节需要注意直接调用这些方法比如resize、rotate通常会返回一个新的Image对象原始的图片对象本身并没有被改变。这种设计避免了无意中修改了原图是个比较安全的做法。处理完了总要保存成果。调用save方法指定一个文件名就行。Pillow很聪明它会根据你给的文件扩展名比如.jpg、.png自动判断该用什么格式来保存。如果你想特别指定格式或者调整像JPG图片质量这样的参数也可以在save方法里进行设置。一些值得注意的实践细节用熟了之后会发现一些能让代码更高效、更健壮的小技巧。比如在处理图片特别是进行裁剪、旋转这类操作时留意一下图片的“模式”会很有帮助。常见的模式有“RGB”彩色、“L”灰度、“RGBA”带透明通道的彩色。如果一张灰度图你非要用处理彩色图的方法去操作它可能就会出错。在不确定的时候先convert一下到需要的模式是个好习惯。还有资源管理的问题。当你用Image.open()打开一张图片它可能并没有立刻把整个图片文件都加载到内存里而是采用了一种“懒加载”的方式。这在你打开一张超大图片时很有用。但是如果你对图片对象进行了操作Python的垃圾回收机制可能不会立刻帮你关闭底层的文件句柄。一个稳妥的做法是把打开和操作图片的代码放在with语句块里或者在处理完成后显式地调用一下图片对象的close()方法。这能避免在长时间运行的程序里打开过多文件导致的问题。性能方面如果只是处理单张图片Pillow的速度完全够用。但如果是要处理成千上万张图片的批量任务比如为整个电商网站的商品图生成缩略图就需要动点脑筋了。一个思路是利用Python的concurrent.futures模块进行并行处理让多张图片的处理同时进行能显著缩短总时间。另一个更根本的思路是对于超大规模的固定图片处理流程可以考虑用numpy数组来直接操作图片数据或者探索像wand基于ImageMagick这样的库它们在某些场景下可能有性能优势。在工具的森林里如何选择提到图片处理Python生态里当然不止Pillow一个选择。比如OpenCV它在计算机视觉领域是绝对的王者功能极其强大从基础的图片读写到复杂的人脸识别、物体跟踪都能做。但它的接口对纯Python开发者来说可能没那么直观安装起来也稍微麻烦一些有时候还需要处理BGR和RGB颜色通道顺序差异这种细节。如果你的任务明确是“图像处理”而非“计算机视觉”Pillow的简单直接可能是更优解。另一个常被提起的是scikit-image它基于numpy和scipy提供了一大堆用于图像分析、滤波、分割的算法学术气息更浓一些。它的功能更偏向于科学计算和图像分析而Pillow则更专注于通用的图片操作打开、编辑、保存。两者甚至有合作scikit-image的教程里有时会推荐用Pillow来读写图片。所以选择哪个工具很大程度上取决于你要做什么。如果需求就是基础的编辑、格式转换、批量生成Pillow的轻量、易用和清晰的文档会让你很快上手。如果任务涉及复杂的数学变换、特征提取或者本身就是学术研究的一部分那么scikit-image或OpenCV可能更合适。很多时候它们并不是互斥的在一个项目里混合使用也很常见——用Pillow读图、预处理然后用其他库进行更专业的分析。总的来说Pillow就像工具箱里那把最趁手的螺丝刀。它不负责所有工作但在它的职责范围内它做得足够好接口清晰让人用着放心。在Python里处理图片从它开始了解总不会错。

更多文章