图片处理
掌握 Pillow 库的基础图片操作
能实现图片缩放、裁剪、旋转、滤镜、格式转换
能批量处理图片,完成加水印等实用场景
核心讲解
Pillow(PIL)是 Python 最主流的图像处理库,功能强大、简单易用,支持几乎所有图片格式。
(1)安装
pip install pillow
(2)核心模块:Image
打开图片:
Image.open()保存图片:
save(),可以指定格式实现转换查看属性:
size尺寸、mode模式、format格式
(3)常用操作
缩放:
resize((宽, 高))、thumbnail()等比例缩略图裁剪:
crop((左, 上, 右, 下))旋转:
rotate(角度)翻转:
transpose()水平 / 垂直翻转滤镜:
ImageFilter模块,模糊、锐化、灰度等绘图:
ImageDraw模块,画文字、图形,用于加水印
(4)模式转换
convert("RGB")转 RGB、convert("L")转灰度图
代码示例
from PIL import Image, ImageFilter, ImageDraw, ImageFont
import os
# ===== 1. 基础操作 =====
# 打开图片
img = Image.open("test.jpg")
print("尺寸:", img.size)
print("格式:", img.format)
print("模式:", img.mode)
# 保存为png格式(格式转换)
img.save("test.png")
# ===== 2. 缩放与裁剪 =====
# 调整尺寸
img_resized = img.resize((800, 600))
img_resized.save("resized.jpg")
# 等比例生成缩略图(不超过指定尺寸)
img_thumb = img.copy()
img_thumb.thumbnail((400, 400))
img_thumb.save("thumbnail.jpg")
# 裁剪图片 (左, 上, 右, 下)
img_crop = img.crop((100, 100, 500, 400))
img_crop.save("cropped.jpg")
# ===== 3. 旋转与翻转 =====
# 旋转90度
img_rotated = img.rotate(90, expand=True) # expand=True自动调整尺寸
img_rotated.save("rotated.jpg")
# 水平翻转
img_flip = img.transpose(Image.FLIP_LEFT_RIGHT)
img_flip.save("flipped.jpg")
# ===== 4. 滤镜与效果 =====
# 转灰度图
img_gray = img.convert("L")
img_gray.save("gray.jpg")
# 模糊滤镜
img_blur = img.filter(ImageFilter.GaussianBlur(radius=5))
img_blur.save("blur.jpg")
# 锐化
img_sharp = img.filter(ImageFilter.SHARPEN)
img_sharp.save("sharp.jpg")
# ===== 5. 加水印 =====
def add_watermark(img_path, text, output_path):
img = Image.open(img_path).convert("RGB")
draw = ImageDraw.Draw(img)
# 字体(Windows系统字体路径)
try:
font = ImageFont.truetype("msyh.ttc", 40)
except:
font = ImageFont.load_default()
# 文字位置(右下角)
width, height = img.size
text_bbox = draw.textbbox((0, 0), text, font=font)
text_w = text_bbox[2] - text_bbox[0]
text_h = text_bbox[3] - text_bbox[1]
x = width - text_w - 20
y = height - text_h - 20
# 半透明文字
draw.text((x, y), text, font=font, fill=(255, 255, 255, 128))
img.save(output_path)
add_watermark("test.jpg", "© 版权所有", "watermarked.jpg")
# ===== 6. 批量处理 =====
def batch_resize(input_dir, output_dir, size=(800, 600)):
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith((".jpg", ".png", ".jpeg")):
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path)
img_resized = img.resize(size)
img_resized.save(os.path.join(output_dir, filename))
print(f"处理完成:{filename}")
# batch_resize("images", "images_resized")
常见误区
图片打开不关闭:Image.open 后虽然会自动管理,但大量处理时最好用 with 或及时关闭
resize 变形:直接 resize 不按比例会拉伸变形,要等比例缩放自己计算尺寸
PNG 透明通道:转 JPG 时透明通道会变黑,要先转 RGB 再保存
字体找不到:ImageFont.truetype 要写对字体路径,不同系统字体路径不一样
大内存占用:处理大图时注意内存,批量处理及时释放对象
课后练习
打开一张图片,调整宽度为 1000px,高度等比例缩放
把一张彩色图片转成灰度图,保存
给图片加上左上角的文字水印
编写脚本,批量把一个文件夹下的所有 jpg 图片转成 png 格式

