Python 图像处理之王:Pillow 库函数全解析与实战指南
在 Python 的生态系统中,如果提到图像处理,Pillow(原名 PIL - Python Imaging Library)是开发者无可争议的首选。无论是简单的图片缩放、裁剪,还是复杂的滤镜处理、水印添加,Pillow 都能以简洁的 API 轻松实现。
本指南专为初学者设计,旨在通过系统化的逻辑,带你从零开始掌握 Pillow 的核心功能。
欢迎大家关注此公众号,后台点击按钮【免费资料】可免费获取【Python入门30节课】电子书
此外小庄推荐一本适合于新手\小白入手一本 Python基础书籍,欢迎大家订阅,也感谢大家支持,我才有更新的动力
1. 前言:为什么选择 Pillow?
Pillow 是 Python 中最流行的图像处理库,它的特点包括:
- • 功能强大:支持超过 30 种图像格式(JPEG, PNG, GIF, BMP, WebP 等)。
2. 环境准备
在开始之前,请确保你的电脑已安装 Python 环境。打开终端(Terminal 或 CMD),输入以下命令安装 Pillow:
pip install Pillow
安装完成后,可以在 Python 脚本中通过 from PIL import Image 来验证是否安装成功。
3. 核心功能解析:分步指南
我们将 Pillow 的功能分为四大模块:基础操作、几何变换、图像增强与滤镜、以及图像绘制。
3.1 基础操作:打开、查看与保存
一切图像处理的起点都是 Image 对象。
from PIL import Image
# 1. 打开图片
img = Image.open("example.jpg")
# 2. 获取图片信息
print(f"格式: {img.format}") # 例如: JPEG
print(f"尺寸: {img.size}") # 例如: (1920, 1080)
print(f"模式: {img.mode}") # 例如: RGB, RGBA, L (灰度)
# 3. 显示图片(调用系统默认查看器)
img.show()
# 4. 保存图片(可更改格式)
img.save("output.png", "PNG")
3.2 几何变换:裁剪、缩放与旋转
这是最常用的图像编辑功能。
- • 裁剪 (Crop):需要传入一个元组
(左, 上, 右, 下)。
# 裁剪:截取图片中间区域
# 坐标系以左上角为 (0,0)
box = (100, 100, 400, 400)
cropped_img = img.crop(box)
# 缩放:强制调整为 800x600
resized_img = img.resize((800, 600), Image.Resampling.LANCZOS)
# 旋转:逆时针旋转 45 度
rotated_img = img.rotate(45, expand=True) # expand=True 保证旋转后图像不被裁剪
# 翻转
flipped_img = img.transpose(Image.FLIP_LEFT_RIGHT) # 左右镜像
3.3 图像增强与滤镜 (ImageFilter)
Pillow 内置了多种滤镜,可以快速实现模糊、锐化等效果。
from PIL import ImageFilter
# 1. 转换为灰度图
gray_img = img.convert("L")
# 2. 高斯模糊
blur_img = img.filter(ImageFilter.GaussianBlur(radius=5))
# 3. 轮廓提取
contour_img = img.filter(ImageFilter.CONTOUR)
# 4. 细节增强
detail_img = img.filter(ImageFilter.DETAIL)
3.4 图像绘制与文字 (ImageDraw)
如果你需要在图片上画线、写字或加水印,ImageDraw 模块是核心。
from PIL import ImageDraw, ImageFont
# 创建一个空白画布 (RGB, 500x300, 白色背景)
canvas = Image.new("RGB", (500, 300), "white")
draw = ImageDraw.Draw(canvas)
# 画一条蓝色的线
draw.line((0, 0, 500, 300), fill="blue", width=5)
# 画一个红色的矩形
draw.rectangle((50, 50, 150, 150), outline="red", width=3)
# 写字 (需要指定字体文件路径,Windows通常在 C:/Windows/Fonts/)
# font = ImageFont.truetype("arial.ttf", 40)
# draw.text((200, 100), "Hello Pillow", fill="black", font=font)
canvas.show()
4. 实战案例:批量生成缩略图
在实际工作中,我们经常需要处理大量图片。以下代码演示了如何将一个文件夹内的所有图片压缩为缩略图:
import os
from PIL import Image
source_dir = "images/"
target_dir = "thumbnails/"
size = (128, 128)
ifnot os.path.exists(target_dir):
os.makedirs(target_dir)
for filename in os.listdir(source_dir):
if filename.endswith((".jpg", ".png", ".jpeg")):
with Image.open(os.path.join(source_dir, filename)) as im:
im.thumbnail(size) # 等比例缩放
im.save(os.path.join(target_dir, "thumb_" + filename))
print(f"已处理: {filename}")
5. 初学者常踩的坑 (Common Pitfalls)
- 1. 坐标系统混淆:Pillow 的坐标系原点
(0, 0) 在左上角。x 轴向右增长,y 轴向下增长。 - 2. 对象不可变性:大多数 Pillow 操作(如
rotate, resize)不会修改原对象,而是返回一个新的 Image 对象。记得用变量接收返回值:img = img.rotate(90)。 - 3. 模式不匹配:保存 JPEG 时不能包含透明通道(RGBA)。如果你的图片是 RGBA 模式,保存为 JPG 前需要先转换:
img.convert("RGB").save("file.jpg")。 - 4. 资源未释放:虽然 Python 有垃圾回收,但在处理数千张大图时,建议使用
with Image.open(...) as img: 语句确保文件句柄及时关闭。
6. 总结与进阶资源
通过本篇文章,你已经掌握了 Pillow 的核心逻辑:打开 -> 变换/处理 -> 保存。
学习建议:
- • 官方文档:Pillow Documentation 是最权威的查阅手册。
- • 练习方向:尝试自己写一个给图片自动添加日期水印的脚本,或者编写一个简单的验证码生成器。
Pillow 是图像处理的基石,掌握了它,未来学习更高级的计算机视觉库(如 OpenCV 或 TensorFlow)将会事半功倍。
如果你觉得这篇文章对你有帮助,欢迎点赞并关注!在图像处理的道路上,我们一同进步。