视频加载失败

常用模块之Pillow模块

2433 字
12 分钟
常用模块之Pillow模块

【一】Pillow模块详解#

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

【1】安装Pillow模块#

  • 要使用Pillow模块,首先需要在Python环境中安装它。
  • 可以通过以下命令使用pip安装Pillow:
Terminal window
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)推导一#

  • 直接读取本地的图片二进制数据
# 测试前端 img 标签是否能获取后端的图片文件数据
def get_verify_img(request):
# 获取到图片文件所在的绝对路径
img_path = os.path.join(settings.BASE_DIR, "static/avatar/default.png")
# 将图片文件打开并将二进制数据读取
with open(img_path, "rb") as fp:
img_data = fp.read()
# 通过 HttpResponse 返回图片二进制数据
return HttpResponse(img_data)

(2)推导二#

  • 利用图片模块生成验证码图片(固定背景色)
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
img_rgb_number = "yellow"
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 定义图片文件位置
img_file_path = os.path.join(settings.BASE_DIR, "static", "img", "verify_img")
os.makedirs(img_file_path, exist_ok=True)
img_path = os.path.join(img_file_path, "code.png")
# 打开本地文件写入图片文件
with open(img_path, 'wb') as fp:
img_obj.save(fp, "png")
# 打开本地文件,读取文件数据并渲染给前端
with open(img_path, "rb") as fp:
img_data = fp.read()
return HttpResponse(img_data)

(3)推导三#

  • 利用图片模块生成验证码图片(随机rgb背景色)
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 定义图片文件位置
img_file_path = os.path.join(settings.BASE_DIR, "static", "img", "verify_img")
os.makedirs(img_file_path, exist_ok=True)
img_path = os.path.join(img_file_path, "code.png")
# 打开本地文件写入图片文件
with open(img_path, 'wb') as fp:
img_obj.save(fp, "png")
# 打开本地文件,读取文件数据并渲染给前端
with open(img_path, "rb") as fp:
img_data = fp.read()
return HttpResponse(img_data)

(4)推导四#

  • 利用io内存管理模块存储和读取文件数据
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
return HttpResponse(img_data)

(5)推导五#

  • 向底色图片中添加验证码
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 利用 ImageDraw 对象产生一个画笔对象
img_draw = ImageDraw.Draw(img_obj)
# 利用 ImageFont 对象定义验证码字体参数(字体样式,字体大小)
img_font = ImageFont.truetype('static/font/汉仪秀英体简.ttf', 30)
# 创建随机验证码(数字 + 字母)
code = ''
for i in range(5):
# 0-9之间的整数
random_int = str(random.randint(0, 9))
# A-Z之间的字母
random_upper = chr(random.randint(65, 90))
# a-z之间的字母
random_lower = chr(random.randint(97, 122))
temp = random.choice([random_int, random_upper, random_lower])
# 这里不使用一次生成五个字符的原因是:一个个写能够控制每个字体的间隙,生成多个一起写没办法控制间隙
# 借助画笔对象依次写入图片数据((x偏移值,y偏移值),写入内容,字体颜色,字体样式)
img_draw.text((i * 60 + 20, 4), temp, rgb_number(), img_font)
# 拼接随机字符串
code += temp
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
return HttpResponse(img_data)

【2】方法总结#

########## 模块准备
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
# 创建图片验证码
def create_verify_code(img_type="RGB", img_size=(310, 38), img_rgb_number=rgb_number()):
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 利用 ImageDraw 对象产生一个画笔对象
img_draw = ImageDraw.Draw(img_obj)
# 利用 ImageFont 对象定义验证码字体参数(字体样式,字体大小)
img_font = ImageFont.truetype('static/font/汉仪秀英体简.ttf', 30)
# 创建随机验证码(数字 + 字母)
code = ''
for i in range(5):
# 0-9之间的整数
random_int = str(random.randint(0, 9))
# A-Z之间的字母
random_upper = chr(random.randint(65, 90))
# a-z之间的字母
random_lower = chr(random.randint(97, 122))
temp = random.choice([random_int, random_upper, random_lower])
# 这里不使用一次生成五个字符的原因是:一个个写能够控制每个字体的间隙,生成多个一起写没办法控制间隙
# 借助画笔对象依次写入图片数据((x偏移值,y偏移值),写入内容,字体颜色,字体样式)
img_draw.text((i * 60 + 20, 4), temp, rgb_number(), img_font)
# 拼接随机字符串
code += temp
# 随机验证码在登录的视图函数中需要比对,所以需要找地方存起来,便于其他函数调用
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
# 返回生成的随机验证码和验证码的图片二进制数据
return code, img_data

【三】应用项目#

  • BBS搭建

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录