文档
Pillow Hello World:缩略图与滤镜
目标
打开一张图片,生成缩略图,添加文字水印,应用滤镜,并保存结果。
完整代码
from PIL import Image, ImageFilter, ImageDraw, ImageFont, ImageOps
# === 1. 打开图片 ===
img = Image.open("input.jpg")
print(f"原图尺寸: {img.size}, 模式: {img.mode}")
# === 2. 生成缩略图(保持比例) ===
thumb = img.copy()
thumb.thumbnail((300, 300))
thumb.save("output_thumb.jpg", quality=85)
print(f"缩略图尺寸: {thumb.size}")
# === 3. 裁剪 + 旋转 ===
# 中心裁剪 500x500
w, h = img.size
crop = img.crop(((w-500)//2, (h-500)//2, (w+500)//2, (h+500)//2))
rotated = crop.rotate(15, expand=True, fillcolor="white")
rotated.save("output_rotated.jpg")
# === 4. 滤镜链 ===
filtered = img.copy()
filtered = filtered.filter(ImageFilter.BLUR) # 先模糊
filtered = filtered.filter(ImageFilter.CONTOUR) # 再轮廓
filtered.save("output_filtered.jpg")
# === 5. 添加文字水印 ===
watermarked = img.copy()
draw = ImageDraw.Draw(watermarked)
text = "© 2024 My Company"
# 使用默认字体(如无字体文件可省略 font 参数)
try:
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 36)
except OSError:
font = ImageFont.load_default()
# 右下角水印
text_bbox = draw.textbbox((0, 0), text, font=font)
text_w, text_h = text_bbox[2] - text_bbox[0], text_bbox[3] - text_bbox[1]
margin = 20
draw.text(
(img.width - text_w - margin, img.height - text_h - margin),
text, fill=(255, 255, 255, 128), font=font
)
watermarked.save("output_watermarked.jpg")
# === 6. 批量灰度化与反转 ===
gray = ImageOps.grayscale(img)
inverted = ImageOps.invert(gray)
inverted.save("output_inverted.jpg")
# === 7. 与 NumPy 互转 ===
import numpy as np
arr = np.array(img)
print(f"NumPy 数组形状: {arr.shape}, dtype: {arr.dtype}")
# 修改像素:将图片上半部分调暗
arr_top = arr.copy()
arr_top[:arr_top.shape[0]//2] = (arr_top[:arr_top.shape[0]//2] * 0.5).astype(np.uint8)
darkened = Image.fromarray(arr_top)
darkened.save("output_darkened.jpg")
print("\n所有输出已生成!")
运行步骤
pip install Pillow numpy
python hello_pillow.py
预期输出
原图尺寸: (1920, 1080), 模式: RGB
缩略图尺寸: (300, 169)
NumPy 数组形状: (1080, 1920, 3), dtype: uint8
所有输出已生成!