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")
练习任务
- 写函数:输入图片 → 输出 原图 + 缩略图 + 灰度图 + 旋转图
- 批量处理文件夹中所有
.png→ 转为.jpg并缩小到 800px 宽
一行代码打开并显示图片:
Image.open("photo.jpg").show()
需要我为你生成 GUI 版本(用 tkinter)或 命令行工具 吗?
欢迎继续提问!