Pillow 是 Python 编程语言中一个功能强大且广泛使用的图像处理库,它实际上是著名的 Python Imaging Library(PIL)的一个活跃分支和继承者。PIL 最初由 Fredrik Lundh 开发,后来由于开发停滞,Pillow 项目应运而生,旨在保持与 PIL 的兼容性并提供持续的更新和维护。如今,Pillow 已经成为 Python 图像处理的事实标准库,支持多种图像格式、提供丰富的图像操作功能,并且易于使用。
安装 Pillow
Pillow 可以通过 Python 包管理工具 pip 轻松安装:
安装后,在代码中导入时仍然使用 import PIL 或直接从 PIL 导入各个模块,例如 from PIL import Image。
核心功能模块
Pillow 的设计遵循模块化原则,核心功能分布在多个子模块中,每个模块专注于特定的图像处理任务。
1. Image 模块
Image 模块是 Pillow 的核心,提供了用于打开、创建、保存和操作图像的基础类和函数。主要功能包括:
打开和保存图像:支持超过 30 种图像格式,如 JPEG、PNG、BMP、GIF、TIFF 等。
from PIL import Imageimg = Image.open('example.jpg')img.save('output.png')
创建新图像:通过 Image.new() 方法可以创建指定模式、大小和颜色的空白图像。
new_img = Image.new('RGB', (200, 100), color='red')
获取图像信息:包括尺寸(img.size)、格式(img.format)、颜色模式(img.mode)等。
转换图像模式:例如将 RGB 转换为灰度图:img.convert('L')。
裁剪、缩放和旋转:
cropped = img.crop((left, top, right, bottom))resized = img.resize((width, height))rotated = img.rotate(angle, expand=True)
粘贴和合并:可以将一张图像粘贴到另一张上,或者通过 Image.blend()、Image.composite() 进行混合。
缩略图:img.thumbnail(size) 生成保持比例的缩略图。
像素级操作:通过 img.getpixel() 和 img.putpixel() 直接读取或修改像素值。
2. ImageDraw 模块
ImageDraw 提供了在图像上绘制二维图形的功能,包括线条、矩形、椭圆、文本等。它使用一个绘图上下文(ImageDraw.Draw 对象)来执行绘制操作。
from PIL import Image, ImageDraw, ImageFontimg = Image.new('RGB', (400, 200), 'white')draw = ImageDraw.Draw(img)draw.rectangle([50, 50, 350, 150], outline='black', width=3)draw.ellipse([100, 60, 300, 140], fill='blue')# 绘制文本font = ImageFont.truetype('arial.ttf', 24)draw.text((150, 80), "Hello Pillow", fill='white', font=font)img.show()
3. ImageFilter 模块
该模块预定义了一系列图像滤镜,用于图像增强和特效处理。滤镜通过 img.filter() 方法应用。
常用的滤镜包括:
BLUR:简单模糊
CONTOUR:轮廓效果
DETAIL:细节增强
EDGE_ENHANCE / EDGE_ENHANCE_MORE:边缘增强
EMBOSS:浮雕效果
FIND_EDGES:边缘检测
SHARPEN:锐化
SMOOTH / SMOOTH_MORE:平滑
此外,还可以自定义卷积核进行滤波操作。
4. ImageEnhance 模块
用于调整图像的色彩、对比度、亮度和锐度。它提供了四个增强器类:Color、Contrast、Brightness 和 Sharpness。每个类都接受一个图像作为参数,并通过 enhance(factor) 方法返回调整后的图像,其中 factor=1.0 表示原始图像。
from PIL import ImageEnhanceenhancer = ImageEnhance.Contrast(img)enhanced_img = enhancer.enhance(1.5) # 增加对比度
5. ImageOps 模块
包含许多有用的图像操作,这些操作通常可以通过组合其他函数实现,但 ImageOps 提供了更便捷的封装。例如:
ImageOps.autocontrast():自动调整对比度
ImageOps.equalize():直方图均衡化
ImageOps.grayscale():转换为灰度
ImageOps.invert():颜色反转
ImageOps.mirror() / ImageOps.flip():水平或垂直翻转
ImageOps.fit():将图像裁剪或填充到指定尺寸
ImageOps.expand():扩展图像边界(添加边框)
6. ImageSequence 模块
用于处理包含多帧的图像,如 GIF 和 FLI/FLC 动画。它可以迭代每一帧,并支持逐帧处理。
from PIL import ImageSequencewith Image.open('animation.gif') as im: for frame in ImageSequence.Iterator(im): # 对每一帧进行处理 frame = frame.convert('RGB')
7. ImageFont 模块
用于加载字体文件,以便在绘制文本时使用。支持 TrueType 和 OpenType 字体。通过 ImageFont.truetype() 加载字体,并指定字号。
8. ImagePalette 模块
管理调色板图像的颜色表,适用于模式为“P”的图像。
9. ImageMath 模块
提供在图像上执行像素级数学运算的功能,允许使用表达式组合多个图像。
10. 其他模块
ImageChops:实现图像的算术运算(加法、减法、乘法等)和逻辑操作。
ImageStat:计算图像的统计信息,如均值、中位数、方差等。
ImageQt:提供与 PyQt 或 PySide 的集成,方便在 GUI 应用中显示 Pillow 图像。
ImageTk:用于与 Tkinter 集成。
ImageShow:提供图像查看功能,调用系统默认图片查看器显示图像。
图像颜色模式
Pillow 支持多种颜色模式,常见的有:
1:1位像素,黑白图像。
L:8位灰度图像。
P:8位图像,使用调色板映射到其他模式。
RGB:3x8位彩色图像。
RGBA:4x8位彩色图像,带透明度通道。
CMYK:4x8位印刷色彩模式。
YCbCr:视频色彩格式。
I:32位有符号整数灰度。
F:32位浮点灰度。
图像格式支持
Pillow 内置了对多种常见图像格式的支持,并可以通过插件扩展。默认支持的格式包括:
读写支持:BMP、EPS、GIF、ICO、IM、JPEG、JPEG 2000、MSP、PCX、PNG、PPM、TIFF、WebP、XBM、等。
只读支持:许多其他格式,如 CUR、DCX、FLI、FLC、FPX、GBR、GD、IMT、IPTC/NAA、MCIDAS、PCD、PIXAR、PSD、SGI、TGA、XPM 等。
图像处理基本流程
典型的 Pillow 图像处理流程如下:
打开图像:Image.open()
图像预处理:如转换模式、调整大小、裁剪等。
应用操作:使用滤镜、增强、绘图、变换等。
保存或显示:img.save() 或 img.show()
示例:生成一个带有文本的缩略图并添加滤镜
from PIL import Image, ImageDraw, ImageFont, ImageFilter# 打开原图with Image.open('input.jpg') as img: # 转换为灰度 gray = img.convert('L') # 生成缩略图 gray.thumbnail((300, 300)) # 应用轮廓滤镜 contoured = gray.filter(ImageFilter.CONTOUR) # 创建绘图对象 draw = ImageDraw.Draw(contoured) # 加载字体 try: font = ImageFont.truetype('arial.ttf', 20) except IOError: font = ImageFont.load_default() # 绘制文本 draw.text((10, 10), "Pillow Demo", fill=255, font=font) # 保存结果 contoured.save('output.jpg')
总结
Pillow 是一个功能全面、易于使用的图像处理库,它继承了 PIL 的优良传统并持续发展。无论是简单的格式转换、图像缩放,还是复杂的滤镜应用、图像合成,Pillow 都能胜任。其模块化设计使得开发者可以根据需要引入特定的功能,代码简洁高效。由于它纯 Python 实现的核心(但部分底层依赖 C 库),在保持跨平台兼容性的同时,也具备不错的性能。无论是 Web 开发、数据分析、自动化脚本还是桌面应用,Pillow 都是 Python 图像处理任务的首选工具。