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印刷色彩

实用小技巧

  1. 处理透明度:使用 RGBA 模式和 mask 参数
  2. 高质量缩放:使用 Image.LANCZOS
   img.resize((w, h), Image.LANCZOS)
  1. 内存优化:大图处理时使用 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")

官方文档

https://pillow.readthedocs.io

练习建议

  1. 写一个脚本批量给图片加水印
  2. 实现图片九宫格切割
  3. 自动生成缩略图文件夹

需要我为你生成一个完整的 图像处理工具箱脚本GUI 界面版本 吗?欢迎继续提问!

类似文章

发表回复

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