Python Pillow库【图像处理库】全面讲解与代码示例

Python Pillow 库是一个强大的图像处理工具,是经典 PIL(Python Imaging Library)库的现代分支。以下是对 Pillow 库的全面讲解和完整代码示例:


一、Pillow 库简介

  • 功能:图像打开/保存、尺寸调整、滤镜应用、颜色处理、绘图、文字添加等
  • 支持格式:JPEG, PNG, GIF, BMP, TIFF 等 30+ 格式
  • 核心模块Image, ImageDraw, ImageFilter, ImageEnhance

二、安装 Pillow

pip install Pillow

三、核心功能及代码示例

1. 打开/保存图像
from PIL import Image

# 打开图像
img = Image.open("input.jpg")
print(f"格式: {
     img.format}, 尺寸: {
     img.size}, 模式: {
     img.mode}")

# 保存图像(自动识别格式)
img.save("output.png")

# 转换格式
img.save("converted.webp", "WEBP")
2. 基本图像操作
# 调整尺寸
resized = img.resize((300, 200))

# 旋转(expand参数防止裁剪)
rotated = img.rotate(45, expand=True)

# 裁剪 (left, upper, right, lower)
cropped = img.crop((100, 100, 400, 400))

# 缩略图生成(保持比例)
img.thumbnail((128, 128))
img.save("thumbnail.jpg")
3. 图像处理
from PIL import ImageFilter, ImageEnhance

# 应用滤镜
blurred = img.filter(ImageFilter.GaussianBlur(radius=2))
contour = img.filter(ImageFilter.CONTOUR)

# 颜色调整
gray = img.convert("L")  # 转为灰度
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0)  # 对比度增强2倍

# 调整亮度
bright_enhancer = ImageEnhance.Brightness(img)
bright_img = bright_enhancer.enhance(1.5)
4. 绘制图形和文字
from PIL import ImageDraw, ImageFont

# 创建新画布
canvas = Image.new("RGB", (500, 500), color=(255, 255, 255))
draw = ImageDraw.Draw(canvas)

# 绘制形状
draw.rectangle([50, 50, 200, 200], fill="red", outline="blue")
draw.ellipse([250, 250, 400, 400], fill="yellow")

# 添加文字
try:
    font = ImageFont.truetype("arial.ttf", 24)
except IOError:
    font = ImageFont.load_default()
draw.text((100, 300), "Hello Pillow!", fill="black", font=font)

canvas.show()
5. 高级操作
# 图像合成
overlay = Image.new("RGBA", img.size, (255, 0, 0, 100))
composite = Image.alpha_composite(img.convert("RGBA"), overlay)

# 像素级操作
pixels = img.load()
for y in range(img.height):
    for x in range(img.width):
        r, g, b = pixels[x, y]
        pixels[x, y] = (r//2, g//2, b//2)  # 暗化效果

# 创建 GIF
images = [img, rotated, cropped]
images[0].save("animation.gif", save_all=True, append_images=images[1:], duration=500, loop=0)

四、综合应用示例:添加水印

def add_watermark(input_path, output_path, text):
    base = Image.open(input_path).convert("RGBA")
    txt = Image.new("RGBA", base.size, (255,255,255,0))
    
    draw = ImageDraw.Draw(txt)
    font = ImageFont.truetype("arial.ttf", 36)
    
    # 计算文字位置
    text_width, text_height = draw.textsize(text, font)
    x = base.width - text_width - 10
    y = base.height - text_height - 10
    
    draw.text((x, y), text, font=font, fill=(255,255,255,128))
    
    combined = Image.alpha_composite(base, txt)
    combined.convert("RGB").save(output_path)

add_watermark("photo.jpg", "watermarked.jpg", "© Your Brand")

五、注意事项

  1. 处理透明通道时使用 RGBA 模式
  2. JPEG 格式不支持透明度,保存时需转换模式
  3. 大尺寸图像处理需注意内存消耗
  4. 使用 with 语句管理文件资源:
    with Image.open("large_image.tiff") as img:
        # 处理图像
    

六、典型应用场景

  • 批量生成缩略图
  • 为图片添加版权信息
  • 图像格式转换工具
  • 创建动态验证码图片
  • 图像数据增强(机器学习)

七、高级图像处理技巧

1. 通道操作与混合
from PIL import Image, ImageChops

# 分离 RGB 通道
r, g, b = img.split()

# 合并时调整通道顺序(例如创建伪红外效果)
modified = Image.merge("RGB", (b, g, r))

# 通道混合(数学运算)
diff = ImageChops.difference(img1, img2)  # 像素差异图
blended = ImageChops.blend(img1, img2, alpha=0.3)  # 图像叠加
2. 颜色空间转换
# CMYK 转 RGB
cmyk_img = Image.open("cmyk_image.tiff").convert("RGB")

# 转换为 HSV 颜色空间(需使用第三方库补充)
# 注意:Pillow 原生不支持 HSV 操作,但可通过 numpy 实现
import numpy as np
hsv_array = np.array(img.convert("HSV"))
# ...处理 HSV 数组...
modified_img = Image.fromarray(hsv_array, "HSV").convert("RGB")
3. EXIF 元数据处理
# 读取 EXIF 数据
exif_data = img._getexif()
if exif_data:
    from PIL.ExifTags import TAGS
    for tag_id, value in exif_data.items():
        tag_name = TAGS.get(tag_id, tag_id)
        print(f"{
     tag_name}: {
     value}")

# 旋转图像(根据 EXIF 方向信息自动修正)
from PIL import ImageOps
fixed_img = ImageOps.exif_transpose
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老胖闲聊

创作不易,您的打赏是最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值