Pillow 图像基本操作

Pillow 图像基本操作(完整实战指南)

使用 Pillow 进行 打开、查看、保存、转换、缩放、裁剪、旋转、翻转 等核心操作。


1. 导入与基础设置

from PIL import Image
import os

所有操作都基于 Image 对象


2. 打开图像

img = Image.open("example.jpg")

支持格式:JPG, PNG, GIF, BMP, TIFF, WebP

# 支持路径变量
path = "images/photo.png"
img = Image.open(path)

3. 查看图像信息

print("格式:", img.format)    # JPG
print("尺寸:", img.size)      # (1920, 1080)
print("模式:", img.mode)      # RGB / RGBA / L
print("信息:", img.info)      # {'dpi': (300, 300)}

4. 显示图像

img.show()  # 调用系统默认图片查看器(适合调试)

注意:服务器环境无 GUI 会报错


5. 保存图像

img.save("output.png")                    # 自动根据扩展名保存
img.save("output.jpg", quality=95)        # JPEG 质量 0-100
img.save("output.webp", lossless=True)    # WebP 无损

批量改名保存

img.save("new_name.jpg")

6. 图像模式转换

目标代码
转为灰度图gray = img.convert("L")
转为 RGB(去透明)rgb = img.convert("RGB")
转为带透明通道rgba = img.convert("RGBA")
gray = img.convert("L")
gray.save("gray.jpg")

7. 缩放图像(resize)

# 固定尺寸(可能变形)
resized = img.resize((800, 600))
resized.save("resized.jpg")

高质量缩放(推荐)

# 使用 LANCZOS 滤波器(默认高质量)
resized = img.resize((800, 600), Image.LANCZOS)

等比缩放(thumbnail)——推荐!

thumb = img.copy()
thumb.thumbnail((400, 400))  # 保持比例,最大 400x400
thumb.save("thumb.jpg")

8. 裁剪图像(crop)

# 定义裁剪框:(left, upper, right, lower)
box = (100, 100, 500, 400)  # 从 (100,100) 到 (500,400)
cropped = img.crop(box)
cropped.save("cropped.jpg")

智能裁剪示例:切九宫格

width, height = img.size
w = width // 3
h = height // 3

for i in range(3):
    for j in range(3):
        box = (j*w, i*h, (j+1)*w, (i+1)*h)
        part = img.crop(box)
        part.save(f"grid_{i}_{j}.jpg")

9. 旋转图像

# 顺时针旋转
rotated_90 = img.rotate(90, expand=True)     # expand=True 避免裁剪
rotated_45 = img.rotate(45, expand=True)

rotated_90.save("rot90.jpg")

expand=False 会保持原尺寸,可能裁剪内容


10. 翻转图像

flip_vertical = img.transpose(Image.FLIP_TOP_BOTTOM)   # 上下翻转
flip_horizontal = img.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转

flip_horizontal.save("flipped.jpg")

快捷方式(等价):

img.transpose(Image.Transpose.FLIP_LEFT_RIGHT)

11. 完整示例:图像处理流水线

from PIL import Image

def process_image(input_path, output_dir):
    os.makedirs(output_dir, exist_ok=True)
    filename = os.path.basename(input_path)
    name, ext = os.path.splitext(filename)

    img = Image.open(input_path)

    # 1. 转为 RGB
    if img.mode != "RGB":
        img = img.convert("RGB")

    # 2. 缩略图
    thumb = img.copy()
    thumb.thumbnail((300, 300))
    thumb.save(f"{output_dir}/{name}_thumb.jpg")

    # 3. 裁剪中心正方形
    w, h = img.size
    size = min(w, h)
    left = (w - size) // 2
    top = (h - size) // 2
    square = img.crop((left, top, left+size, top+size))
    square.save(f"{output_dir}/{name}_square.jpg")

    # 4. 旋转并保存
    img.rotate(90, expand=True).save(f"{output_dir}/{name}_rot90.jpg")

    print(f"处理完成: {input_path}")

# 使用
process_image("input.jpg", "processed")

常用方法速查表

操作方法
打开Image.open(path)
保存img.save(path, quality=95)
信息img.format, img.size, img.mode
灰度img.convert("L")
缩放img.resize((w,h))
等比缩放img.thumbnail((w,h))
裁剪img.crop((l,t,r,b))
旋转img.rotate(angle, expand=True)
上下翻转img.transpose(Image.FLIP_TOP_BOTTOM)
左右翻转img.transpose(Image.FLIP_LEFT_RIGHT)

性能提示

  • 大图操作前 img = img.copy() 避免影响原图
  • 批量处理时避免重复 open
  • 使用 with Image.open(...) as img: 自动关闭文件
with Image.open("big.jpg") as img:
    img = img.resize((800, 600))
    img.save("small.jpg")

练习任务

  1. 写函数:输入图片 → 输出 原图 + 缩略图 + 灰度图 + 旋转图
  2. 批量处理文件夹中所有 .png → 转为 .jpg 并缩小到 800px 宽

一行代码打开并显示图片

Image.open("photo.jpg").show()

需要我为你生成 GUI 版本(用 tkinter)或 命令行工具 吗?
欢迎继续提问!

类似文章

发表回复

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