内容目录
原文链接:http://www.juzicode.com/python-module-pillow
Pillow是Python的图像处理标准库,支持30+种图像格式的读写操作,提供丰富的图像处理功能,适用于图像编辑、格式转换、计算机视觉预处理等场景。
应用场景
- 图像尺寸调整与裁剪
- 滤镜效果应用
- 图像格式批量转换
- 验证码图片生成
- 图像元数据读取
- 计算机视觉预处理
安装与导入
# juzicode.com/VX公众号:juzicode
pip install Pillow
from PIL import Image, ImageFilter, ImageDraw
基本用法
1. 创建新图像
本示例演示创建纯色背景的新图像。使用Image.new创建RGB模式图像,指定尺寸和颜色。save方法保存为PNG格式,quality参数设置JPEG质量(1-100)。
# juzicode.com/VX公众号:juzicode
from PIL import Image
img = Image.new('RGB', (800, 600), color='#FF0000')
img.save('red_bg.jpg', quality=90)
print(f"图像尺寸: {img.size} 模式: {img.mode}")
运行结果:
图像尺寸: (800, 600) 模式: RGB
2. 读取图像文件
通过open方法读取文件,显示图像属性:
# juzicode.com/VX公众号:juzicode
from PIL import Image
image = Image.open('neza.jpg')
print(image.format) # 格式(如 'JPEG')
print(image.size) # 尺寸((width, height))
print(image.mode) # 模式(如 'RGB')
运行结果:
JPEG
(892, 470)
RGB
3. 同比例调整图像尺寸
thumbnail方法可以保持宽高比缩小图像,它的第一个入参size是一个元组(x,y),缩放后的图像宽度和高度均不超过size中的任意一个值。这个地方理解起来稍微有点“拗口”,我们通过一个例子来看下效果:
# juzicode.com/VX公众号:juzicode
from PIL import Image
img_raw = Image.new('RGB', (1600, 1200), '#00FF00')
img = img_raw.copy()
img.thumbnail((400, 400)) # 等比例缩小
print(img.size)
img = img_raw.copy()
img.thumbnail((800, 200)) # 等比例缩小
print(img.size)
运行结果:
(400, 300)
(267, 200)
生成的图像尺寸为 (1600, 1200) ,第1个缩放的size为 (400, 400) , 宽度的缩放比例为4倍,高度为3倍,所以需要参照宽度的比例来缩放,都缩小4倍,得到的图像大小为 (400, 300) ;第2个缩放size为 (800, 200), 宽度的缩放比例为2倍,高度为8倍,所以需要参照高度的比例来缩放,都缩小8倍,得到的图像大小为 (267,200) 。
4. 强制调整图像尺寸
另外一个缩放的方法是使用resize()方法,该方法会按照入参的指定宽高强制调整尺寸,图像就可能会产生变形。
# juzicode.com/VX公众号:juzicode
from PIL import Image
img_raw = Image.new('RGB', (1600, 1200), '#00FF00')
img = img_raw.resize((500, 500)) # 等比例缩小
print(img.size)
img = img_raw.resize((800, 200)) # 等比例缩小
print(img.size)
运行结果:
(500, 500)
(800, 200)
5. 应用滤镜效果
使用ImageFilter模块实现常见滤波,示例应用高斯模糊和边缘增强效果,show()方法调用系统默认查看器预览。
# juzicode.com/VX公众号:juzicode
from PIL import ImageFilter
from PIL import Image
img = Image.open('neza.jpg')
blur = img.filter(ImageFilter.GaussianBlur(10))
edges = img.filter(ImageFilter.FIND_EDGES)
edges.show()
运行结果:

高级功能
1. 图像合成
使用alpha通道实现透明叠加,首先创建一个蓝色背景图像,再创建一个RGBA模式图像,通过paste方法混合图像,第3个参数mask指定透明度通道。
# juzicode.com/VX公众号:juzicode
from PIL import Image
base = Image.new('RGB', (800, 600), 'blue')
overlay = Image.new('RGBA', (200, 200), (255,0,0,128)) # 半透明红色
base.paste(overlay, (300,200), overlay)
base.save('combined.png')
base.show()
运行结果:

2. 批量格式转换
遍历目录转换图像格式,convert()方法转换图片格式,其中optimize参数启用JPEG优化
# juzicode.com/VX公众号:juzicode
import os
from PIL import Image
if not os.path.exists('output'):
os.mkdir('output')
for file in os.listdir():
if file.endswith('.png'):
img = Image.open(file)
img.convert('RGB').save(f'output/{file[:-4]}.jpg',
quality=85, optimize=True)
运行结果:
将src_images目录下PNG转为优化后的JPEG
3. 生成GIF动画
通过多帧图像创建动态GIF。设置帧率(duration)和循环次数(loop),保存时指定disposal方法。
# juzicode.com/VX公众号:juzicode
from PIL import Image
frames = []
for i in range(5):
img = Image.new('RGB', (100,100),
color=(i*50, 0, 0))
frames.append(img)
frames[0].save('animation.gif', save_all=True,
append_images=frames[1:],
duration=200, loop=0, disposal=2)
运行结果:
生成颜色渐变的5帧循环GIF
4.图像通道分离、合并
分离处理RGB通道,实现颜色校正。使用split和merge方法调整绿色通道增益。
# juzicode.com/VX公众号:juzicode
from PIL import Image
img = Image.new('RGB', (500, 500), (100,200,50))
img.save('color_adjusted-raw.jpg')
r, g, b = img.split()
g = g.point(lambda x: x*1.2) # 增强绿色通道
adjusted = Image.merge('RGB', (r, g, b))
adjusted.save('color_adjusted.jpg')
运行结果:

生成绿色增强后的图像
5. 添加文字水印
通过ImageDraw模块绘制文本。指定字体文件、字号和位置,textbbox获取文本区域,实现居中水印效果。
# juzicode.com/VX公众号:juzicode
from PIL import ImageFont, ImageDraw
from PIL import Image
img = Image.open('neza.jpg')
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('arial.ttf', 40)
text = "VX:juzicode"
bbox = draw.textbbox((0,0), text, font=font)
x = (img.width - bbox[2]) // 5
y = (img.height - bbox[3]) // 5
draw.text((x,y), text, fill='red', font=font)
img.save('watermark.jpg')
img.show()
运行结果:

总结
Pillow为Python图像处理提供核心支持:
- 支持主流图像格式的读写操作
- 提供丰富的图像处理算法
- 支持多帧动画和图像合成
- 跨平台兼容性好
注意事项:
- 处理大尺寸图像需注意内存占用
- 部分格式需要额外解码器支持
- 颜色模式转换可能导致数据丢失