Python轮子:Pillow 图像处理专家

原文链接: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图像处理提供核心支持:

  • 支持主流图像格式的读写操作
  • 提供丰富的图像处理算法
  • 支持多帧动画和图像合成
  • 跨平台兼容性好

注意事项:

  • 处理大尺寸图像需注意内存占用
  • 部分格式需要额外解码器支持
  • 颜色模式转换可能导致数据丢失

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注