Pillow 教程
Pillow 教程(Python Imaging Library)
Pillow 是 Python 中最流行的图像处理库,是 PIL(Python Imaging Library)的友好分支。它支持打开、操作和保存多种图像格式。
1. 安装 Pillow
pip install pillow
验证安装:
from PIL import Image
print(Image.__version__)
2. 基本操作
打开图像
from PIL import Image
img = Image.open("example.jpg")
print(img.format, img.size, img.mode) # JPG (1920, 1080) RGB
显示图像
img.show() # 调用系统默认图片查看器
保存图像
img.save("output.png") # 转换为 PNG
3. 图像信息与格式转换
# 获取信息
print(f"格式: {img.format}")
print(f"尺寸: {img.size}")
print(f"模式: {img.mode}") # RGB, RGBA, L(灰度)
# 转换为灰度图
gray = img.convert("L")
gray.save("gray.jpg")
# 转换为 RGB(去除透明通道)
rgb_img = img.convert("RGB")
4. 缩放与裁剪
缩放(resize)
# 等比缩放
resized = img.resize((800, 600))
resized.save("resized.jpg")
# 高质量缩放(推荐)
thumbnail = img.copy()
thumbnail.thumbnail((400, 400)) # 保持宽高比,最大 400x400
thumbnail.save("thumb.jpg")
裁剪(crop)
# 定义裁剪区域 (left, upper, right, lower)
box = (100, 100, 500, 400)
cropped = img.crop(box)
cropped.save("cropped.jpg")
5. 旋转与翻转
# 旋转 90 度
rotated = img.rotate(90, expand=True) # expand=True 保持完整图像
rotated.save("rotated.jpg")
# 翻转
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)
6. 滤镜效果
from PIL import ImageFilter
# 模糊
blurred = img.filter(ImageFilter.BLUR)
blurred.save("blurred.jpg")
# 锐化
sharpened = img.filter(ImageFilter.SHARPEN)
# 边缘检测
edges = img.filter(ImageFilter.FIND_EDGES)
edges.save("edges.jpg")
7. 绘制文字与图形
from PIL import ImageDraw, ImageFont
# 创建绘图对象
draw = ImageDraw.Draw(img)
# 绘制文字(需要字体文件,或使用默认)
try:
font = ImageFont.truetype("arial.ttf", 36)
except:
font = ImageFont.load_default()
draw.text((50, 50), "Hello Pillow!", fill=(255, 0, 0), font=font)
# 绘制矩形
draw.rectangle([100, 100, 300, 200], outline="red", width=3)
# 绘制圆形
draw.ellipse([350, 350, 450, 450], fill="blue", outline="white")
img.save("drawn.jpg")
8. 批量处理图像
import os
from PIL import Image
input_dir = "input/"
output_dir = "output/"
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.endswith(('.png', '.jpg', '.jpeg')):
img = Image.open(os.path.join(input_dir, filename))
img = img.resize((800, 600))
img.save(os.path.join(output_dir, "resized_" + filename))
9. 创建新图像
# 创建空白图像
new_img = Image.new("RGB", (400, 300), color=(73, 109, 137))
new_img.save("new_image.jpg")
# 创建透明图像
transparent = Image.new("RGBA", (200, 200), (0, 0, 0, 0))
10. 图像合成(贴图)
background = Image.open("bg.jpg")
overlay = Image.open("logo.png").resize((100, 100))
# 确保 overlay 有透明通道
if overlay.mode != "RGBA":
overlay = overlay.convert("RGBA")
# 粘贴(位置 (x, y))
background.paste(overlay, (50, 50), overlay) # 最后一个参数是 mask
background.save("composite.jpg")
常见模式说明
| 模式 | 说明 |
|---|---|
1 | 二值图像(1-bit) |
L | 灰度图(8-bit) |
RGB | 真彩色 |
RGBA | 真彩色 + 透明通道 |
CMYK | 印刷色彩 |
实用小技巧
- 处理透明度:使用
RGBA模式和mask参数 - 高质量缩放:使用
Image.LANCZOS
img.resize((w, h), Image.LANCZOS)
- 内存优化:大图处理时使用
img.close()或上下文管理器
完整示例:水印添加器
from PIL import Image, ImageDraw, ImageFont
def add_watermark(input_path, output_path, text="© MySite"):
img = Image.open(input_path).convert("RGBA")
watermark = Image.new("RGBA", img.size, (255,255,255,0))
draw = ImageDraw.Draw(watermark)
font = ImageFont.truetype("arial.ttf", 40) if os.path.exists("arial.ttf") else ImageFont.load_default()
# 计算文字大小
text_bbox = draw.textbbox((0, 0), text, font=font)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
x = img.width - text_width - 20
y = img.height - text_height - 20
draw.text((x, y), text, font=font, fill=(255, 255, 255, 128))
watermarked = Image.alpha_composite(img, watermark)
watermarked.convert("RGB").save(output_path)
# 使用
add_watermark("photo.jpg", "watermarked.jpg")
官方文档
练习建议:
- 写一个脚本批量给图片加水印
- 实现图片九宫格切割
- 自动生成缩略图文件夹
需要我为你生成一个完整的 图像处理工具箱脚本 或 GUI 界面版本 吗?欢迎继续提问!