Python脚本图像处理:Pillow库常用操作实战指南
📚 文章目录导读
- Pillow库概述与安装 – 为什么选择Pillow?环境搭建与基础概念
- 图像文件读写与格式转换 – 打开、保存、批量转换格式
- 图像几何变换 – 缩放、旋转、裁剪、翻转
- 色彩与通道操作 – 灰度化、颜色分离与合并、调色板
- 图像滤镜与增强 – 模糊、锐化、边缘检测、对比度调整
- 文本与图形绘制 – 在图片上添加水印、标注、形状
- 实战案例:批量加水印脚本 – 完整代码与运行效果
- 常见问题与问答 – 解决实际开发中的疑难杂症
- SEO优化技巧与总结 – 提升Python图像处理文章排名的建议
Pillow库概述与安装
Pillow是Python生态系统中最受欢迎的图像处理库之一,它是PIL(Python Imaging Library)的活跃分支,提供了强大的图像操作能力,无论是个人博客的图片压缩,还是企业级的验证码生成、水印批量添加,Pillow都能胜任。

安装方式(建议在虚拟环境中进行):
pip install Pillow
安装完成后,通过from PIL import Image导入核心模块,Pillow支持超过30种图像格式,包括JPEG、PNG、GIF、BMP、TIFF等。
核心概念:图像在Pillow中以Image对象呈现,每个对象包含像素矩阵、调色板、元数据等,你可以把它想象成一个二维数组,每个单元格是一个像素点(RGB或RGBA值)。
图像文件读写与格式转换
打开与显示
from PIL import Image
img = Image.open('example.jpg') # 支持路径、文件对象、BytesIO
img.show() # 调用系统默认图片查看器
保存与格式转换
img.save('output.png') # 自动根据扩展名转换格式
img.save('output.jpg', quality=85) # JPEG可指定压缩质量
批量转换示例:将文件夹内所有PNG转为JPG
import os
from PIL import Image
for fname in os.listdir('./images'):
if fname.endswith('.png'):
img = Image.open(f'./images/{fname}')
new_name = fname.replace('.png', '.jpg')
img.save(f'./output/{new_name}', 'JPEG')
图像几何变换
缩放
img_resized = img.resize((300, 300)) # 直接指定目标尺寸 img_thumbnail = img.thumbnail((300, 300)) # 等比例缩放(修改原对象)
注意:resize会拉伸变形,thumbnail保持宽高比。
旋转
img_rotated = img.rotate(45, expand=True, fillcolor=(255,255,255)) # expand=True自动扩展画布避免裁剪,fillcolor填充空白区域
裁剪
box = (100, 50, 400, 350) # (左, 上, 右, 下) img_cropped = img.crop(box)
翻转
img_flip_h = img.transpose(Image.FLIP_LEFT_RIGHT) # 水平翻转 img_flip_v = img.transpose(Image.FLIP_TOP_BOTTOM) # 垂直翻转
色彩与通道操作
灰度化
img_gray = img.convert('L') # 模式'L'为8位灰度
# 其他模式:'1'(二值), 'RGB', 'RGBA', 'CMYK'
通道分离与合并
r, g, b = img.split() # 返回三个灰度图像
merged = Image.merge('RGB', (r, g, b))
# 调整某个通道的亮度
r = r.point(lambda x: x * 1.5) # 增强红色通道
调色板模式(P模式)
img_p = img.quantize(colors=64) # 将真彩图转为256色以内 # 适用于GIF、图标等场景
图像滤镜与增强
Pillow内置了ImageFilter模块和ImageEnhance模块。
常用滤镜
from PIL import ImageFilter blur = img.filter(ImageFilter.BLUR) # 模糊 sharp = img.filter(ImageFilter.SHARPEN) # 锐化 edge = img.filter(ImageFilter.FIND_EDGES) # 边缘检测 emboss = img.filter(ImageFilter.EMBOSS) # 浮雕效果
增强参数调节
from PIL import ImageEnhance enhancer = ImageEnhance.Contrast(img) img_contrast = enhancer.enhance(2.0) # 对比度加倍 enhancer2 = ImageEnhance.Brightness(img) img_bright = enhancer2.enhance(1.5) # 亮度提高50% enhancer3 = ImageEnhance.Sharpness(img) img_sharp = enhancer3.enhance(2.0) # 锐度增强
文本与图形绘制
使用ImageDraw模块可以在图像上绘制线条、矩形、椭圆和文字。
from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(img)
# 绘制矩形
draw.rectangle([50, 50, 200, 150], outline='red', width=3)
# 绘制文本
font = ImageFont.truetype('arial.ttf', 36)
draw.text((100, 100), "Hello Pillow", fill='blue', font=font)
# 绘制圆形
draw.ellipse([300, 50, 400, 150], fill='green', outline='black')
字体注意:中文环境需使用支持中文的字体文件(如微软雅黑),否则会出现乱码。
实战案例:批量加水印脚本
以下脚本将遍历input文件夹内所有图片,添加半透明文字水印并输出到output文件夹。
import os
from PIL import Image, ImageDraw, ImageFont
def add_watermark(input_dir, output_dir, text="Copyright", font_size=40, opacity=60):
os.makedirs(output_dir, exist_ok=True)
for fname in os.listdir(input_dir):
if fname.lower().endswith(('.jpg', '.png', '.jpeg')):
img = Image.open(os.path.join(input_dir, fname)).convert('RGBA')
# 创建透明图层
txt_layer = Image.new('RGBA', img.size, (255,255,255,0))
draw = ImageDraw.Draw(txt_layer)
font = ImageFont.truetype("arial.ttf", font_size)
# 计算文本居中位置(可改为右下角)
text_width, text_height = draw.textsize(text, font=font)
x = (img.width - text_width) // 2
y = (img.height - text_height) // 2
# 半透明白色文字
draw.text((x, y), text, font=font, fill=(255,255,255,opacity))
# 合并图层
watermarked = Image.alpha_composite(img, txt_layer)
watermarked = watermarked.convert('RGB') # 保存为JPEG需转RGB
watermarked.save(os.path.join(output_dir, fname), 'JPEG', quality=90)
# 使用示例
add_watermark('./input', './output', text='MySite.com')
运行效果:每张图片中央出现半透明水印,且原图不被覆盖。
常见问题与问答(FAQ)
Q1:处理大图片时内存占用过高怎么办?
A:避免一次性加载全分辨率图片,使用Image.open()后,立即调用thumbnail()或resize()缩小尺寸,对于超大图片(如5000万像素),可使用Image.open()的pyramid参数(部分格式支持)或分块处理。
Q2:Pillow无法打开某些格式(如WebP、HEIC)?
A:Pillow默认支持常见格式,但WebP需安装libwebp-dev,HEIC需额外安装pillow-heif插件,建议使用pip install pillow[heif,webp]安装扩展包。
Q3:图片旋转后出现黑边怎么办?
A:使用rotate(angle, expand=True, fillcolor=(R,G,B))。expand参数自动计算新画布大小,fillcolor填充空白区域,推荐用白色(255,255,255)或透明色(0,0,0,0)。
Q4:如何提高文字水印的抗锯齿效果?
A:使用ImageFont.truetype()加载高质量字体,并在绘制前先创建大图再缩放到目标尺寸,也可使用ImageDraw.Draw.text()的stroke_width参数增加描边。
Q5:Pillow与OpenCV如何选择?
A:Pillow适合简单图像处理、格式转换、UI设计;OpenCV适合计算机视觉任务(人脸识别、视频流处理),两者可结合使用:用Pillow读写文件,用OpenCV进行复杂处理。
SEO优化技巧与总结
为了让这篇文章符合必应和谷歌的排名规则,需注意以下几点:
- 关键词密度:核心词“Python”、“Pillow”、“图像处理”、“常用操作”自然分布在标题、H1-H3标签、段落首句,总密度控制在1.5%-3%。
- 内部链接:在文章内提及“批量加水印”时,可链接到Python文件操作或脚本编写的相关文章。
- 外部权威引用:参考Pillow官方文档(本文若出现域名,请替换为[官方文档占位符])和Python官方库文档。
- 长尾词优化:包含“Python批量转换图片格式”、“Pillow添加水印代码”、“图像滤镜对比度调整”等用户常搜短语。
- 结构化数据:使用H2/H3标题、代码块、列表、问答格式,方便搜索引擎提取摘要。
Pillow是一个轻量且强大的图像处理工具,从基础的格式转换到高级的滤镜合成,都能用几行Python代码实现,本文涵盖了80%的日常操作场景,建议读者将每个示例在本地运行一遍,并尝试组合不同功能(如先滤镜再添加水印),遇到问题请优先查阅Pillow官方文档,或在Stack Overflow搜索具体报错信息,掌握这些核心操作后,你可以轻松实现微信头像自动处理、电商图片批量调整、验证码生成等实际项目。