Pillow 入门实例

使用 Pillow,可以通过以下方式导入 Pillow 的主要模块:

from PIL import Image, ImageFilter, ImageDraw, ImageFont

Pillow 保持了与 PIL 的 API 兼容性,这意味着大多数为 PIL 编写的代码可以直接与 Pillow 一起使用,只需将导入语句从 import PIL 更改为 from PIL import ...


基础图像操作

加载并显示图像

测试图片(下载到本地测试):

实例

from PIL import Image

# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")  

# 显示图像(系统默认图片查看器)
img.show()  

# 获取图像信息
print("格式:", img.format)  # JPEG/PNG
print("尺寸:", img.size)    # (宽, 高)
print("模式:", img.mode)   # RGB/L/CMYK

输出示例:

格式: JPEG
尺寸: (987, 987)
模式: RGB

解析:

  • Image.open() 读取图像文件,返回 Image 对象。

  • show() 调用系统默认图片查看器显示图像(仅调试用,生产环境不建议)。

  • formatsizemode 是图像的元信息属性。

保存图像

以下代码将图像保存为不同格式的文件:一个转换为 PNG 格式的 "example.png" 文件,以及一个指定 JPEG 质量为 95 的 "example_quality.jpg" 文件。

实例

from PIL import Image

# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")  

# 显示图像(系统默认图片查看器)
img.show()  

# 获取图像信息
print("格式:", img.format)  # JPEG/PNG
print("尺寸:", img.size)    # (宽, 高)
print("模式:", img.mode)   # RGB/L/CMYK

# 保存为不同格式
img.save('example.png')  # 转换为PNG格式
img.save('example_quality.jpg', quality=95)  # 指定JPEG质量

图像格式转换

实例

from PIL import Image

img = Image.open("tiger.jpeg")  
# 转换为灰度图
gray_img = img.convert("L")  
gray_img.save("tiger_gray.png")  # 保存为PNG

# 转换为RGB(即使原图是RGBA)
rgb_img = img.convert("RGB")  
rgb_img.save("tiger_rgb.jpg", quality=95)  # 质量参数(1-100)
  • convert("L") 将图像转为灰度模式(8-bit 黑白)。
  • save() 可指定格式(通过扩展名或 format 参数),quality 控制 JPEG 压缩质量。

图像处理操作

调整图像大小

设置固定高度宽度:

实例

from PIL import Image

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

# 调整尺寸
resized_img = img.resize((400, 300))  
resized_img.save("cat_small.jpg")

# 生成缩略图(保持比例)
img.thumbnail((200, 200))  # 原地修改
img.save("cat_thumbnail.jpg")

按比例缩放

设置比例:

实例

from PIL import Image

# 打开图像(支持 JPEG、PNG、GIF 等)
img = Image.open("tiger.jpeg")  

# 按比例缩放
width, height = img.size
scaled_image = img.resize((width//2, height//2))
scaled_image.show()

裁剪与旋转图像

实例

from PIL import Image

img = Image.open("tiger.jpeg")

# 裁剪 (left, top, right, bottom)
cropped_img = img.crop((100, 100, 500, 400))  
cropped_img.save(""tiger_cropped.jpg")

# 旋转(逆时针90度)
rotated_img = img.rotate(90, expand=True)  # expand防止裁剪
rotated_img.save("
"tiger_rotated.jpg")

裁剪后效果如下:

旋转后效果如下:

  • crop() 参数为矩形区域坐标(左上+右下)。

  • rotate(角度) 默认会裁剪转角,expand=True 自动调整画布大小。


图像增强和滤镜

应用滤镜

实例

from PIL import Image, ImageFilter

img = Image.open("tiger.jpeg")

# 模糊滤镜
blurred_image = img.filter(ImageFilter.BLUR)
blurred_image.show()

# 边缘增强
edge_enhanced = img.filter(ImageFilter.EDGE_ENHANCE)
edge_enhanced.show()

调整亮度和对比度

实例

from PIL import Image, ImageEnhance

img = Image.open("tiger.jpeg")


# 增强亮度
enhancer = ImageEnhance.Brightness(img)
bright_image = enhancer.enhance(1.5)  # 1.5倍亮度
bright_image.show()

# 增强对比度
enhancer = ImageEnhance.Contrast(img)
contrast_image = enhancer.enhance(2.0)  # 2倍对比度
contrast_image.show()

在图像上绘制

绘制基本形状

实例

from PIL import Image, ImageDraw

img = Image.open("tiger.jpeg")

# 创建绘图对象
draw = ImageDraw.Draw(img)

# 绘制矩形
draw.rectangle([(100, 100), (300, 300)], outline="red", width=5)

# 绘制直线
draw.line([(0, 0), (500, 500)], fill="blue", width=3)

# 绘制圆形
draw.ellipse([(200, 200), (400, 400)], outline="green", width=4)

img.show()

生成的图如下:

添加文字

可以在图片上添加文字,需要设置字体路径或者使用系统默认的:

实例

from PIL import Image, ImageDraw, ImageFont

img = Image.open("tiger.jpeg")

# 创建绘图对象
draw = ImageDraw.Draw(img)

# 加载字体 (需要系统中存在该字体)
font_size = 80  # 设置字体大小
try:
    font = ImageFont.truetype("arial.ttf", font_size)
except:
    font = ImageFont.load_default(font_size)
draw.text((150, 150), "Hello Runoob!", fill="red", font=font)

img.show()

生成的图如下:


综合实例:创建缩略图并添加水印

实例

from PIL import Image, ImageDraw, ImageFont

def create_thumbnail_with_watermark(input_path, output_path, size=(200, 200)):
    # 打开原始图像
    original = Image.open(input_path)
   
    # 创建缩略图
    thumbnail = original.copy()
    thumbnail.thumbnail(size)
   
    # 添加水印
    draw = ImageDraw.Draw(thumbnail)
    try:
        font = ImageFont.truetype("arial.ttf", 20)
    except:
        font = ImageFont.load_default()
   
    # 计算文本位置(右下角),中文需要设置字体,不然会乱码
    text = "WWW.RUNOOB.COM"
    # 获取文本尺寸
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]
    x = thumbnail.width - text_width - 10
    y = thumbnail.height - text_height - 10
   
    # 绘制半透明背景
    draw.rectangle([x-5, y-5, x+text_width+5, y+text_height+5], fill=(0,0,0,128))
   
    # 绘制文本
    draw.text((x, y), text, fill="white", font=font)
   
    # 保存结果
    thumbnail.save(output_path)
    print(f"缩略图已保存至 {output_path}")

# 使用示例
create_thumbnail_with_watermark("tiger.jpeg", "thumbnail.jpg")

生成的缩略图如下:


常见问题解答

Q1: 如何处理 Pillow 无法识别的图像格式?

A1: Pillow 支持大多数常见图像格式。如果遇到不支持的格式,可以尝试安装额外的解码器或先将图像转换为支持的格式(如 PNG 或 JPEG)。

Q2: 如何批量处理多个图像文件?

A2: 可以使用 Python 的 glob 模块配合循环来批量处理:

实例

import glob
from PIL import Image

for file in glob.glob("images/*.jpg"):
    img = Image.open(file)
    # 处理图像...
    img.save(f"processed_{file}")

Q3: 如何处理大图像而不耗尽内存?

A3: 对于非常大的图像,可以使用 Image 对象的 load() 方法逐块处理,或者使用 ImageOps.fit() 来限制处理区域。

通过以上实例和说明,你应该已经掌握了 Pillow 的基本使用方法。Pillow 功能强大,建议多实践探索其更多高级功能!