本节摘要:Pillow 是 Python 图像处理的标准库级选择,是经典 PIL(Python Imaging Library)的现代继任者。本节讲清 Pillow 的来龙去脉,给出 pip 与 conda 两种安装方式、国内镜像源配置,以及安装后如何验证版本,帮助你三分钟搭好环境。
阅读完本节,你应当能够:
Python 里处理图像,绕不开 Pillow。但很多初学者第一反应是:为什么叫"枕头"?名字确实有点萌——Pillow 官方寓意是像枕头一样给你支撑,让你在图像处理里"安枕无忧"。
更重要的历史背景:Pillow 的前身是 PIL(Python Imaging Library),那是 Python 图像处理的鼻祖,功能强大,但开发在 2009 年左右就停滞了——旧版 Python 升级后它跟不上,出现了大量兼容问题。Pillow 项目接过了这个摊子,做了一件事:延续 PIL 的 API 风格,同时持续适配新 Python 版本。所以你在代码里写的是 from PIL import Image(保持旧习惯),但背后跑的是 Pillow(新的实现)。
关键直觉:"PIL 是历史,Pillow 是现在"。import 时写 PIL 是历史原因,装的却是 Pillow,二者在代码里不冲突。
打开终端,输入:
python --version pip --version
能看到版本号(如 Python 3.9.7、pip 21.2.4)说明环境就绪。若系统同时装了 Python 2 和 3,可能要用 python3 和 pip3 区分。
pip install pillow
或明确使用 Python 3:
pip3 install pillow
安装完成会看到类似 Successfully installed Pillow-x.y.z 的输出。Pillow 包名在 pip 里是小写 pillow,import 时是大写开头 PIL,别搞混。
from PIL import Image print("Pillow 版本:", Image.__version__)
能打印出版本号(如 9.1.0)就说明装好了。这一步值得养成习惯——任何库装完先验证,避免"以为自己装了其实没装"的尴尬。
| 问题 | 原因 | 解决办法 |
|---|---|---|
| pip 命令找不到 | pip 未加入环境变量 | 用 python -m pip install pillow |
| 下载极慢 | 访问 PyPI 网络不稳 | 换国内镜像源 |
| 安装报编译错误 | 环境缺编译器 | 用预编译 wheel,避免源码编译 |
| conda 用户冲突 | 环境管理混乱 | 用 conda install pillow |
⚠️ 常见坑:不要把 Pillow 装进错误的 Python 环境。装了多个 Python(系统版、Anaconda、虚拟环境)时,pip 可能装到 A 环境、import 用的是 B 环境,结果报 ModuleNotFoundError。解决方案:用
python -m pip install pillow确保装进当前 python 对应的环境。
💡 关键直觉:虚拟环境是 Python 项目的好习惯。每个项目独立环境,Pillow 装进项目虚拟环境,避免全局环境污染与版本冲突。
国内网络访问 PyPI 经常慢,换清华镜像一行解决:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
想长期生效,可配置 pip 默认源(在用户目录创建 pip.conf 或 pip.ini 写入源地址)。换源后下载速度往往提升一个数量级。
conda install pillow
conda 会自动解决依赖,适合 Anaconda/Miniconda 用户。注意 conda 与 pip 混用时可能出现环境不一致,建议固定用一种方式。
装好环境后,跑一个最简程序验证全链路:
from PIL import Image # 生成一张 200x200 的红色图片 img = Image.new("RGB", (200, 200), "red") # 保存为 PNG img.save("red_box.png") # 打开验证 img2 = Image.open("red_box.png") print(img2.size, img2.mode)
运行后你会看到 (200, 200) RGB 的输出,目录下多了一个 red_box.png。从创建、保存到重新打开,整个闭环跑通了——这就是图像处理的最小可运行示例,后面的所有内容都是在这个闭环上扩展。
💡 关键直觉:图像处理学习的最佳节奏是"先跑通最小示例,再逐步加复杂度"。每学一个新功能,都在这个闭环上加一步,而不是从零开始造新程序。
安装完成后,先建立"Pillow 到底能干什么"的整体认知,后面学起来才有方向。Pillow 的核心能力分六大块:
| 能力域 | 典型操作 | 章节 |
|---|---|---|
| 格式读写 | 打开/保存 30+ 种格式 | 1.2、3.4 |
| 几何变换 | 裁剪、缩放、旋转、翻转 | 1.4、2.6 |
| 颜色处理 | 模式转换、色彩调整、通道 | 1.5、2.1、2.4 |
| 滤镜特效 | 模糊、锐化、边缘、浮雕 | 2.2 |
| 绘图标注 | 形状、文字、水印 | 2.3 |
| 分析统计 | 直方图、像素统计、可视化 | 4.3 |
💡 关键直觉:Pillow 覆盖了"读、改、画、析"四件事。读是格式读写,改是几何与颜色,画是绘图标注,析是统计可视化。绝大多数日常图像需求,都在这四件事的范围内。
了解版本策略能避免不少坑:
版本节奏:Pillow 大约每 4-6 个月发布一个新版本,跟随 Python 的发布节奏。新版本会添加新格式支持、修复安全漏洞,建议保持较新的版本。
Python 版本兼容:每个 Pillow 版本都声明支持的 Python 版本范围。老项目里"Pillow 装不上"多半是 Python 版本过旧或过新。装之前先看 python --version,再到官方发布页查对应支持范围。
查看版本的方法:
from PIL import Image print(Image.__version__) # 代码内查看
pip show pillow # 命令行查看
⚠️ 常见坑:升级 Pillow 后行为变化。部分 API 在新版本有行为调整(如插值常量的位置变化、部分方法弃用)。生产项目升级 Pillow 前,建议在测试环境跑一遍用例,别直接上生产。
问:pip 和 pip3 有什么区别?
在只装了 Python 3 的环境里两者等价;如果系统同时有 Python 2,pip 可能指向 Python 2。不确定时统一用 python -m pip install pillow——它明确作用于当前 python 命令对应的环境。
问:为什么 import PIL 却显示 ModuleNotFoundError?
多半是"装错环境":pip 装到了 A 环境,import 用的解释器是 B 环境。用 python -m pip install pillow 再 import 试试;或用 IDE 的"使用项目虚拟环境"功能。
问:安装时报依赖冲突怎么办?
Pillow 依赖较少,冲突多发生在"全局环境装了很多包"时。推荐创建虚拟环境:python -m venv venv 然后激活,在里面安装——干净且可复现。
问:一定要用最新版吗?
不是。功能满足需求即可,但建议不低于次新版本——旧版本可能有未修复的安全漏洞(Pillow 历史上多次修复图片解析类漏洞)。
Pillow 的安装在不同系统上有细微差异,提前知道能少踩坑:
| 系统 | 推荐方式 | 注意事项 |
|---|---|---|
| Windows | pip install pillow | 自动下载预编译 wheel,无需编译环境 |
| macOS | pip install pillow | 若用 Homebrew 的 Python,用 brew 装 |
| Linux | pip install pillow | 部分发行版需 libjpeg/zlib 系统库 |
| Anaconda | conda install pillow | 避免 pip/conda 混用 |
Windows 用户的特殊提醒:如果装的是"从源码编译版"(如 pip install 报缺少编译器),改用预编译 wheel 即可——Pillow 官方为各平台发布预编译包,一般不需要自己编译。
Linux 用户的特殊提醒:装 Pillow 报 libjpeg 相关错误时,先装系统库:sudo apt install libjpeg-dev zlib1g-dev(Debian/Ubuntu 系)或 sudo dnf install libjpeg-devel(Fedora 系)。多数情况下预编译 wheel 已内置依赖,报错通常是"用了系统 Python 而非虚拟环境"。
把环境验证做成一个"健康检查"脚本,装完跑一遍心里有底:
# 环境健康检查脚本 import sys from PIL import Image, ImageFilter, ImageDraw def check(): # 1. 版本 print(f"Python: {sys.version.split()[0]}") print(f"Pillow: {Image.__version__}") # 2. 基础能力 img = Image.new("RGB", (10, 10), "red") print("创建图片: OK") # 3. 滤镜 img.filter(ImageFilter.BLUR) print("滤镜: OK") # 4. 绘图 draw = ImageDraw.Draw(img) draw.rectangle([(0, 0), (5, 5)], fill="blue") print("绘图: OK") # 5. 保存读取 img.save("_test.png") back = Image.open("_test.png") print(f"读写: OK ({back.format})") # 6. 格式支持 from PIL import features print(f"WebP 支持: {features.check('webp')}") print(f"JPEG 支持: {features.check('jpg')}") check()
这个脚本覆盖了 Pillow 的核心功能面:创建、滤镜、绘图、读写、格式支持。全 OK 说明环境可用;某一步失败,定位到具体环节再修。
遇到 Pillow 相关错误,先用一棵"排查树"定位问题方向:
报错了吗? ├─ ModuleNotFoundError: No module named 'PIL' │ └─ 没装 Pillow 或装错环境 → pip install pillow / 检查 python -m pip ├─ OSError: cannot identify image file │ └─ 文件不是图片或已损坏 → 换文件 / 检查路径 ├─ ValueError: image has wrong mode │ └─ 模式与操作不匹配 → 先 convert 到需要的模式 ├─ PermissionError: [WinError 32] │ └─ 文件被占用 → 用 with 管理 / 关闭占用进程 └─ MemoryError └─ 图片太大或对象累积 → 缩尺寸 / 用 with / 释放引用
排查思路:先看"哪个环节"(导入/打开/处理/保存),再看"什么类型"(缺依赖/模式错/文件问题)。把错误分类,比背错误信息更有效——第四章 4.4 有完整的错误排查清单。
最后给一个"为什么从 Pillow 入门"的理由,坚定学习信心:
| 维度 | Pillow 的优势 |
|---|---|
| 上手难度 | API 直观,几分钟跑通第一个程序 |
| 生态地位 | 几乎所有图像库(numpy/OpenCV/PyTorch)都与它互转 |
| 覆盖范围 | 读存、处理、绘图、分析一应俱全 |
| 社区成熟 | 二十多年历史,文档完善、案例海量 |
| 学习价值 | 打好"图像=像素矩阵"的底子,后续学什么都快 |
一句话:Pillow 是图像处理领域的"Python 入门书"——简单但不浅薄,够用且能扩展。学完它,你既掌握了日常图像处理的能力,又拿到了进入整个图像生态的钥匙。
最后给一份"从零到能跑"的完整行动清单,照着做即可:
python --version(建议 3.9+)python -m venv venv(Windows)或 python3 -m venv venv(macOS/Linux)venv\Scripts\activate(Windows)或 source venv/bin/activate(macOS/Linux)pip install pillow(慢则加 `-i 「相关地址请参见官方文档」python -c "from PIL import Image; print(Image.__version__)"推荐理由:虚拟环境让项目互不污染,镜像源解决下载慢,验证命令确认安装成功——六步走完,环境就绪,不会再有"装了半天不能用"的烦恼。这也是后续所有章节的运行前提。
了解版本历史,选版本时有依据:
| 版本 | 发布时间 | 关键变化 |
|---|---|---|
| 8.x | 2021 | Resampling 枚举引入 |
| 9.x | 2022 | rounded_rectangle 等新 API |
| 10.x | 2023 | 移除旧弃用 API,性能提升 |
| 11.x | 2024 | 新增格式支持,修复安全漏洞 |
选版本建议:
pip install pillow==版本号 可锁定版本判断"版本是否合适"的方法:查看 Image.__version__ 与官方发布说明对照。版本不是越高越好,而是"你的代码依赖的 API 是否被支持"——老代码用了 9.x 的 API,升到 11.x 要确认没被移除。
遇到"装不上/用不了"时,跑这个诊断脚本快速定位:
import sys import platform print("=== 环境诊断 ===") print(f"Python 版本: {sys.version}") print(f"系统: {platform.system()} {platform.release()}") try: import PIL print(f"Pillow 路径: {PIL.__file__}") from PIL import Image print(f"Pillow 版本: {Image.__version__}") except ImportError as e: print(f"Pillow 导入失败: {e}") print("→ 尝试: pip install pillow") # 检查格式支持(有些 Pillow 编译时缺少依赖) from PIL import features for fmt in ["jpg", "webp", "png", "gif", "tiff"]: print(f" {fmt:6s}: {'支持' if features.check(fmt) else '不支持'}") # 测试基本功能 try: img = Image.new("RGB", (10, 10), "red") img.save("_diag_test.png") print("基本读写: OK") import os os.remove("_diag_test.png") except Exception as e: print(f"基本读写失败: {e}")
诊断脚本的价值:一次跑完,输出"版本、路径、格式支持、基本功能"四个维度的状态——"先诊断、再解决"是环境问题的处理原则。格式支持检查尤其有用:某些系统装的 Pillow 缺少 libjpeg,JPG 处理会报错,这个检查能提前发现。
装好环境后,用一段"能力速览"代码快速体验 Pillow 的覆盖面:
from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageOps # 1. 创建 + 保存 img = Image.new("RGB", (300, 200), "lightblue") img.save("demo1.png") # 2. 打开 + 属性 img2 = Image.open("demo1.png") print(f"尺寸: {img2.size}, 模式: {img2.mode}") # 3. 滤镜 img3 = img.filter(ImageFilter.GaussianBlur(radius=5)) img3.save("demo2.png") # 4. 绘图 draw = ImageDraw.Draw(img) draw.ellipse([50, 30, 150, 130], fill="orange") img.save("demo3.png") # 5. 增强 bright = ImageEnhance.Brightness(img).enhance(1.5) bright.save("demo4.png") print("体验完成,查看 demo1-4.png")
体验的价值:5 个示例覆盖 Pillow 五大能力(创建/读写/滤镜/绘图/增强)——"快速体验全貌"比"深挖一个功能"更适合入门。跑完这段,你就对"Pillow 能做什么"有了整体印象,后续章节就是逐个深化。

环境就绪,下一节我们正式打开第一张真实图片,学 Image.open、save、show 的读写显示三连。