【模块补充】Pillow生成图像文件

发布时间 2023-07-21 15:47:26作者: Chimengmeng

【一】Pillow模块详解

  • Pillow是一个Python图像处理库,它提供了丰富的图像处理功能和易于使用的接口。
  • 本文将详细介绍Pillow模块的各种功能,并提供一些实际案例演示。

【1】安装Pillow模块

  • 要使用Pillow模块,首先需要在Python环境中安装它。
  • 可以通过以下命令使用pip安装Pillow:
pip install pillow
  • 安装完成后,就可以在代码中导入Pillow模块并开始使用。

【2】Pillow模块的常用功能

(1)图像打开与保存

  • Pillow可以轻松地打开和保存各种图像文件格式
    • 如JPEG、PNG、BMP等。
  • 下面是一个打开和保存图像的简单示例:
from PIL import Image

# 打开图像
image = Image.open('image.jpg')

# 保存图像
image.save('output.jpg')

(2)图像缩放与裁剪

  • Pillow提供了强大的图像处理功能
    • 包括图像的缩放和裁剪。
  • 例如,可以使用resize()方法调整图像的尺寸:
from PIL import Image

# 打开图像
image = Image.open('image.jpg')

# 缩放图像至指定尺寸
resized_image = image.resize((300, 200))

# 保存缩放后的图像
resized_image.save('resized_image.jpg')
  • 也可以使用crop()方法裁剪图像:
from PIL import Image

# 打开图像
image = Image.open('image.jpg')

# 裁剪图像
cropped_image = image.crop((100, 100, 300, 300))

# 保存裁剪后的图像
cropped_image.save('cropped_image.jpg')

(3)图像滤镜和调整

  • Pillow还提供了一系列图像滤镜和调整功能
    • 例如模糊、锐化、颜色调整等。
  • 下面是一个应用滤镜和调整的示例:
from PIL import Image, ImageFilter

# 打开图像
image = Image.open('image.jpg')

# 应用模糊滤镜
blurred_image = image.filter(ImageFilter.BLUR)

# 应用颜色调整
enhanced_image = image.enhance(1.5)

# 保存滤镜和调整后的图像
blurred_image.save('blurred_image.jpg')
enhanced_image.save('enhanced_image.jpg')

【3】案例演示:图像处理

  • 现在,让我们结合前面介绍的功能,演示一个图像处理的案例。
  • 假设我们有一张图片
    • 我们希望将其缩放至指定尺寸并应用模糊滤镜
    • 然后保存处理后的图像。
  • 我们可以使用以下代码实现:
from PIL import Image, ImageFilter

# 打开图像
image = Image.open('image.jpg')

# 缩放图像至指定尺寸
resized_image = image.resize((400, 300))

# 应用模糊滤镜
blurred_image = resized_image.filter(ImageFilter.BLUR)

# 保存处理后的图像
blurred_image.save('processed_image.jpg')
  • 以上代码将打开名为"image.jpg"的图像,缩放至400x300的尺寸
  • 然后应用模糊滤镜,并将处理后的图像保存为"processed_image.jpg"。

【4】总结:

  • 本文介绍了Pillow模块的安装和常用功能,包括图像的打开与保存、缩放与裁剪、图像滤镜和调整。
  • 并提供了一个实际案例演示,展示了如何使用Pillow进行图像处理。
  • 使用Pillow模块可以快速、简便地完成各种图像处理任务。

【二】案例演示,动态图片验证码

【1】推导过程

(1)读取本地文件并返回

  • 将要展示的图片文件保存到本地
    • 通过读取本地的二进制图片文件数据
    • 返回给前端做展示
# 方式一:直接从后端获取图片二进制数据 --- 步骤繁琐/文件固定
with open('book/static/avatar/设计师蚩梦.jpg', 'rb') as f:
     data = f.read()
return HttpResponse(data)

(2)动态产生背景色底板图片

  • 利用Pillow模块
    • 动态生成纯色图片文件
    • 保存文件
    • 再代开文件读取返回给前端
from PIL import Image, ImageDraw, ImageFont

'''
Image       生成图片
ImageDraw   能够在图片上乱涂乱画
ImageFont   控制字体样式
'''
# 方式二:动态产生图片 --- 读取繁琐
img_obj = Image.new('RGB', (310, 38), get_random())
# 将图片对象保存
with open('book/static/code/code.png', 'wb') as f:
    img_obj.save(f, 'png')
# 将图片对象读取
with open('book/static/code/code.png', 'rb') as f:
    data = f.read()
return HttpResponse(data)

(3)利用文件管理器模块

  • 动态控制生成的文件的数据存储和读取
from PIL import Image, ImageDraw, ImageFont

'''
Image       生成图片
ImageDraw   能够在图片上乱涂乱画
ImageFont   控制字体样式
'''
# 内存管理器模块
from io import BytesIO, StringIO

'''
BytesIO     临时存储数据,返回的数据是二进制数据
StringIO    临时存储数据,返回的数据是字符串数据
'''
# 方式三:文件存储繁琐IO操作效率低  借助于内存管理器模块
img_obj = Image.new('RGB', (310, 38), get_random())
# 生成一个内存管理器对象 --- 可以看成是文件句柄
io_obj = BytesIO()
img_obj.save(io_obj, 'png')
# 从内存管理器中读取到二进制图片数据返回给前端
data = io_obj.getvalue()
return HttpResponse(data)

(4)动态将字符书写到图片上

  • 生成图片,书写字符,返回完整的图片
# 图片相关的模块
#  pip install pillow
from PIL import Image, ImageDraw, ImageFont

'''
Image       生成图片
ImageDraw   能够在图片上乱涂乱画
ImageFont   控制字体样式
'''
import random
# 内存管理器模块
from io import BytesIO, StringIO

'''
BytesIO     临时存储数据,返回的数据是二进制数据
StringIO    临时存储数据,返回的数据是字符串数据
'''
# 随机获取 0-255数字
def get_random():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

# 方法四:写图片验证码
img_obj = Image.new('RGB', (310, 38), get_random())
# 产生一个画笔对象
img_draw = ImageDraw.Draw(img_obj)
# (字体样式,字体大小)
img_font = ImageFont.truetype('book/static/font/汉仪秀英体简.ttf', 30)

# 随机验证码 -- 五位数(数字/小写字母/大写字母)
code = ''
for i in range(5):
    random_int = str(random.randint(0, 9))  # 0-9之间的整数
    random_upper = chr(random.randint(65, 90))  # A-Z之间的字母
    random_lower = chr(random.randint(97, 122))  # a-z之间的字母
    temp = random.choice([random_int, random_upper, random_lower])
    '''
        一个个写而不是一次写多个
        因为一个个写能够控制每个字体的间隙,生成多个一起写没办法控制间隙
        '''
    img_draw.text((i * 60 + 20, 4), temp, get_random(), img_font)
    # 拼接随机字符串
    code += temp
# print(code)
# 随机验证码在登录的视图函数中需要比对,所以需要找地方存起来,便于其他函数调用
request.session['code'] = code
io_obj = BytesIO()
img_obj.save(io_obj, 'png')
data = io_obj.getvalue()
return HttpResponse(data)

【三】应用项目

  • BBS搭建

博客链接;