Pillow 入门实例
使用 Pillow,可以通过以下方式导入 Pillow 的主要模块:
from PIL import Image, ImageFilter, ImageDraw, ImageFont
Pillow 保持了与 PIL 的 API 兼容性,这意味着大多数为 PIL 编写的代码可以直接与 Pillow 一起使用,只需将导入语句从 import PIL 更改为 from PIL import ...。
基础图像操作
加载并显示图像
测试图片(下载到本地测试):
实例
# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")
# 显示图像(系统默认图片查看器)
img.show()
# 获取图像信息
print("格式:", img.format) # JPEG/PNG
print("尺寸:", img.size) # (宽, 高)
print("模式:", img.mode) # RGB/L/CMYK
输出示例:
格式: JPEG 尺寸: (987, 987) 模式: RGB
解析:
Image.open()
读取图像文件,返回Image
对象。show()
调用系统默认图片查看器显示图像(仅调试用,生产环境不建议)。format
、size
、mode
是图像的元信息属性。
保存图像
以下代码将图像保存为不同格式的文件:一个转换为 PNG 格式的 "example.png" 文件,以及一个指定 JPEG 质量为 95 的 "example_quality.jpg" 文件。
实例
# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")
# 显示图像(系统默认图片查看器)
img.show()
# 获取图像信息
print("格式:", img.format) # JPEG/PNG
print("尺寸:", img.size) # (宽, 高)
print("模式:", img.mode) # RGB/L/CMYK
# 保存为不同格式
img.save('example.png') # 转换为PNG格式
img.save('example_quality.jpg', quality=95) # 指定JPEG质量
图像格式转换
实例
img = Image.open("tiger.jpeg")
# 转换为灰度图
gray_img = img.convert("L")
gray_img.save("tiger_gray.png") # 保存为PNG
# 转换为RGB(即使原图是RGBA)
rgb_img = img.convert("RGB")
rgb_img.save("tiger_rgb.jpg", quality=95) # 质量参数(1-100)
- convert("L") 将图像转为灰度模式(8-bit 黑白)。
- save() 可指定格式(通过扩展名或 format 参数),quality 控制 JPEG 压缩质量。
图像处理操作
调整图像大小
设置固定高度宽度:
实例
img = Image.open("tiger.jpg")
# 调整尺寸
resized_img = img.resize((400, 300))
resized_img.save("cat_small.jpg")
# 生成缩略图(保持比例)
img.thumbnail((200, 200)) # 原地修改
img.save("cat_thumbnail.jpg")
按比例缩放
设置比例:
实例
# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")
# 按比例缩放
width, height = img.size
scaled_image = img.resize((width//2, height//2))
scaled_image.show()
裁剪与旋转图像
实例
img = Image.open("tiger.jpeg")
# 裁剪 (left, top, right, bottom)
cropped_img = img.crop((100, 100, 500, 400))
cropped_img.save(""tiger_cropped.jpg")
# 旋转(逆时针90度)
rotated_img = img.rotate(90, expand=True) # expand防止裁剪
rotated_img.save(""tiger_rotated.jpg")
裁剪后效果如下:
旋转后效果如下:
crop()
参数为矩形区域坐标(左上+右下)。rotate(角度)
默认会裁剪转角,expand=True
自动调整画布大小。
图像增强和滤镜
应用滤镜
实例
img = Image.open("tiger.jpeg")
# 模糊滤镜
blurred_image = img.filter(ImageFilter.BLUR)
blurred_image.show()
# 边缘增强
edge_enhanced = img.filter(ImageFilter.EDGE_ENHANCE)
edge_enhanced.show()
调整亮度和对比度
实例
img = Image.open("tiger.jpeg")
# 增强亮度
enhancer = ImageEnhance.Brightness(img)
bright_image = enhancer.enhance(1.5) # 1.5倍亮度
bright_image.show()
# 增强对比度
enhancer = ImageEnhance.Contrast(img)
contrast_image = enhancer.enhance(2.0) # 2倍对比度
contrast_image.show()
在图像上绘制
绘制基本形状
实例
img = Image.open("tiger.jpeg")
# 创建绘图对象
draw = ImageDraw.Draw(img)
# 绘制矩形
draw.rectangle([(100, 100), (300, 300)], outline="red", width=5)
# 绘制直线
draw.line([(0, 0), (500, 500)], fill="blue", width=3)
# 绘制圆形
draw.ellipse([(200, 200), (400, 400)], outline="green", width=4)
img.show()
生成的图如下:
添加文字
可以在图片上添加文字,需要设置字体路径或者使用系统默认的:
实例
img = Image.open("tiger.jpeg")
# 创建绘图对象
draw = ImageDraw.Draw(img)
# 加载字体 (需要系统中存在该字体)
font_size = 80 # 设置字体大小
try:
font = ImageFont.truetype("arial.ttf", font_size)
except:
font = ImageFont.load_default(font_size)
draw.text((150, 150), "Hello Runoob!", fill="red", font=font)
img.show()
生成的图如下:
综合实例:创建缩略图并添加水印
实例
def create_thumbnail_with_watermark(input_path, output_path, size=(200, 200)):
# 打开原始图像
original = Image.open(input_path)
# 创建缩略图
thumbnail = original.copy()
thumbnail.thumbnail(size)
# 添加水印
draw = ImageDraw.Draw(thumbnail)
try:
font = ImageFont.truetype("arial.ttf", 20)
except:
font = ImageFont.load_default()
# 计算文本位置(右下角),中文需要设置字体,不然会乱码
text = "WWW.RUNOOB.COM"
# 获取文本尺寸
bbox = draw.textbbox((0, 0), text, font=font)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
x = thumbnail.width - text_width - 10
y = thumbnail.height - text_height - 10
# 绘制半透明背景
draw.rectangle([x-5, y-5, x+text_width+5, y+text_height+5], fill=(0,0,0,128))
# 绘制文本
draw.text((x, y), text, fill="white", font=font)
# 保存结果
thumbnail.save(output_path)
print(f"缩略图已保存至 {output_path}")
# 使用示例
create_thumbnail_with_watermark("tiger.jpeg", "thumbnail.jpg")
生成的缩略图如下:
常见问题解答
Q1: 如何处理 Pillow 无法识别的图像格式?
A1: Pillow 支持大多数常见图像格式。如果遇到不支持的格式,可以尝试安装额外的解码器或先将图像转换为支持的格式(如 PNG 或 JPEG)。
Q2: 如何批量处理多个图像文件?
A2: 可以使用 Python 的 glob 模块配合循环来批量处理:
实例
from PIL import Image
for file in glob.glob("images/*.jpg"):
img = Image.open(file)
# 处理图像...
img.save(f"processed_{file}")
Q3: 如何处理大图像而不耗尽内存?
A3: 对于非常大的图像,可以使用 Image 对象的 load()
方法逐块处理,或者使用 ImageOps.fit()
来限制处理区域。
通过以上实例和说明,你应该已经掌握了 Pillow 的基本使用方法。Pillow 功能强大,建议多实践探索其更多高级功能!
点我分享笔记