首页 自动驾驶

Python 图像处理利器:Pillow 模块深度解析与实战避坑

分类:自动驾驶
字数: (1666)
阅读: (2257)
内容摘要:Python 图像处理利器:Pillow 模块深度解析与实战避坑,

在后端开发中,经常需要处理图片相关的任务,例如生成验证码、图片缩放、添加水印等等。Python 的 Pillow 模块正是为此而生,它是 PIL(Python Imaging Library)的一个分支,提供了丰富的功能,可以方便地进行图像处理。

Pillow 安装与基本使用

Pillow 的安装非常简单,直接使用 pip 即可:

pip install Pillow

下面是一个简单的例子,展示了如何使用 Pillow 打开、显示和保存图片:

Python 图像处理利器:Pillow 模块深度解析与实战避坑
from PIL import Image

# 打开图片
img = Image.open("example.jpg")

# 显示图片 (不推荐在服务器端直接显示,通常在本地调试使用)
# img.show()

# 获取图片大小
width, height = img.size
print(f"图片宽度: {width}, 高度: {height}")

# 保存图片为新的格式
img.save("example.png", "PNG")

常用图像操作

Pillow 提供了丰富的图像操作方法,下面介绍一些常用的:

1. 图像缩放

使用 resize() 方法可以对图像进行缩放。在生产环境中,我们经常会用到 Nginx 的反向代理和负载均衡来分发请求,此时图片的缩放如果放在前端,会增加前端的压力。放在后端处理,可以使用 Pillow 来高效地进行图片缩放。

Python 图像处理利器:Pillow 模块深度解析与实战避坑
from PIL import Image

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

# 缩放到 50% 大小
new_size = (img.width // 2, img.height // 2)
resized_img = img.resize(new_size)
resized_img.save("resized_example.jpg")

2. 图像裁剪

使用 crop() 方法可以对图像进行裁剪,参数是一个包含左、上、右、下坐标的元组:

from PIL import Image

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

# 裁剪图像 (左上角坐标 (100, 100),右下角坐标 (300, 300))
cropped_img = img.crop((100, 100, 300, 300))
cropped_img.save("cropped_example.jpg")

3. 图像旋转

使用 rotate() 方法可以对图像进行旋转,参数是旋转的角度(逆时针):

Python 图像处理利器:Pillow 模块深度解析与实战避坑
from PIL import Image

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

# 旋转 45 度
rotated_img = img.rotate(45)
rotated_img.save("rotated_example.jpg")

4. 图像滤镜

Pillow 提供了多种滤镜效果,例如模糊、锐化等:

from PIL import Image, ImageFilter

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

# 应用模糊滤镜
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save("blurred_example.jpg")

# 应用锐化滤镜
sharpened_img = img.filter(ImageFilter.SHARPEN)
sharpened_img.save("sharpened_example.jpg")

实战:生成验证码

下面是一个使用 Pillow 生成验证码的例子:

Python 图像处理利器:Pillow 模块深度解析与实战避坑
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter

def generate_captcha(width=120, height=30, char_length=4, font_size=20):
    code_list = []
    img = Image.new('RGB', (width, height), color=(255, 255, 255))
    font = ImageFont.truetype('arial.ttf', font_size)
    draw = ImageDraw.Draw(img)

    for i in range(char_length):
        random_char = random.choice('abcdefghijkmnopqrstuvwxyz23456789')
        code_list.append(random_char)
        draw.text((10 + i * 25, 5), random_char, fill=(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)), font=font)

    # 添加干扰线
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)))

    # 添加干扰点
    for i in range(30):
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.point((x, y), fill=(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)))

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    return img, ''.join(code_list)

if __name__ == '__main__':
    img, code = generate_captcha()
    img.save('captcha.png')
    print(f"验证码:{code}")

注意:arial.ttf 需要替换成你系统上实际存在的字体文件路径。在生产环境,如果你的验证码请求量很大,你需要考虑使用多进程或者协程来提高并发连接数,避免因为 Pillow 的图像处理阻塞主线程。同时,可以考虑使用宝塔面板等工具来简化服务器的管理和部署。

Pillow 使用避坑经验

  1. 内存占用: Pillow 在处理大图时会占用大量内存,需要注意控制图片大小,避免 OOM (Out Of Memory) 错误。
  2. 文件格式: 不同的图片格式在压缩率和质量上有所不同,需要根据实际需求选择合适的格式。
  3. 颜色模式: Pillow 支持多种颜色模式,例如 RGB、RGBA、CMYK 等,需要根据实际需求选择合适的模式。
  4. 字体路径: 使用 ImageFont 加载字体时,需要提供正确的字体文件路径,否则会报错。
  5. 线程安全: 在多线程环境下使用 Pillow 时,需要注意线程安全问题,避免出现数据竞争。

总结

Pillow 是 Python 中一个非常强大的图像处理库,掌握它可以帮助我们轻松解决各种图像相关的任务。希望本文能够帮助你更好地理解和使用 Pillow 模块。

Python 图像处理利器:Pillow 模块深度解析与实战避坑

转载请注明出处: 程序员脱发君

本文的链接地址: http://m.acea4.store/blog/515116.SHTML

本文最后 发布于2026-03-30 01:31:03,已经过了29天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 网瘾少年 6 天前
    关于线程安全,能更详细地讲一下吗?具体在什么场景下会出现问题?
  • 欧皇附体 5 天前
    验证码生成这块,我一般还会加一些扭曲变形,让机器识别更困难一些。
  • 追梦人 3 天前
    写得不错,验证码那个例子很实用,正好最近在研究这个。
  • 向日葵的微笑 9 小时前
    Pillow 真的很好用,就是处理大图的时候确实比较耗内存,需要注意优化。