一、pillow的简单使用

1.安装

方式一:

如果配置了python中的script路径为环境变量,直接cmd中执行如下命令:

pip3 install pillow

方式二:

通过编译器环境,如pycharm中的settings->project interpreter-->点击+号安装

2.快速使用

1.创建图片对象

from PIL import Image
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 创建一个图片对象,可以在对象中画图写字 # 在图片查看器中打开
# img.show() # 保存在本地
with open('code.png','wb') as f:
img.save(f,format='png')

2.创建一个画笔对象,用于在图片对象上作画

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB') # 指定图片创建画笔对象

3.画点

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示坐标
# 第二个参数:表示颜色
draw.point([100, 100], fill="red") # fill参数用于指定画笔的颜色
draw.point([300, 300], fill=(255, 255, 255)) # rgb表示方式

4.画线

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill='red')
draw.line((100,100,300,100), fill=(255, 255, 255))

5.画圆

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill='red')
draw.line((100,100,300,100), fill=(255, 255, 255))

6.写文本

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
draw.text([0,0],'python',"red")

7.指定字体写文本

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示颜色
draw.text([0, 0], 'python', "red", font=font)

3.登录图片验证码生成

生成随机验证码图片的函数

import os
import string
import random
from io import BytesIO
from PIL import Image,ImageDraw,ImageFont
from AliCRM import settings # 项目中的settings文件,配置了BASEDIR路径,在这里无需关注


def get_authcode_img(request):
"""
获取随机验证码,带干扰噪点,
:param request: request请求,用于将验证码存放在session中
:return: 返回验证码图片的数据内容
"""
def get_background_color(): # 定义一个获取图片背景/噪点颜色的函数,产生浅色
color = tuple((random.choices(range(160,256),k=3)))
return color

def get_content_color(): # 定义一个获取文字颜色的函数,产生深色
color = tuple((random.choices(range(0,100),k=3)))
return color

img_obj = Image.new("RGB",(117,34),get_background_color()) # 创建一个图片对象
draw_obj = ImageDraw.Draw(img_obj) # 通过图片对象生成一个画笔对象
font_path = os.path.join(settings.BASE_DIR,"statics","font","cerepf__.ttf") # 获取字体,注意有些字体无法显示数字
font_obj = ImageFont.truetype(font_path,32) # 创建一个字体对象
random_code = '' # 用户验证的字符串
all_char = string.ascii_letters+string.digits
for i in range(4):
a = random.choice(all_char)
random_code += a

draw_obj.text((22,-3),random_code,fill=get_content_color(),font=font_obj)

width = 117
height = 34

# 添加噪线
for i in range(5): # 添加5条干扰线
# 两个坐标点确定一条线
x1 = random.randint(0,width)
y1 = random.randint(0,height)
x2 = random.randint(0,width)
y2 = random.randint(0,height)
draw_obj.line((x1,y1,x2,y2),fill=get_background_color()) # 画噪线

# 添加噪点
for i in range(30):
draw_obj.point((random.randint(0,width),random.randint(0,height)),fill=get_background_color())

f = BytesIO() # 生成内存操作符-句柄
img_obj.save(f,"png") # 将图片存在内存中
data = f.getvalue()
# 获取句柄中的内容

# # 存验证码方式:1.存在全局变量(不可取,多个用户会顶替)2.存在各自客户的session中
# # 方式1
# global valid_str
# valid_str = random_code

# 方式二,推荐
request.session["authcode"] = random_code
return data

get_authcode_img函数

项目中登录验证码

# 验证码视图类
class GetAuthImg(views.View):
"""获取验证码视图类"""

def get(self, request):
data = authcode.get_authcode_img(request) # 调用生成验证码的函数生成验证码
print("验证码:",request.session.get("authcode"))
return HttpResponse(data)

验证码路由

urlpatterns = [
# 验证码url
url(r'^get_auth_img/', accounts.GetAuthImg.as_view(), name="get_auth_img"),
]

前端代码使用

<img id="authImg" src="{% url 'get_auth_img' %}" alt="验证码">

<!--点击验证码图片刷新js-->
<script>
// 验证码刷新
$("#authImg").on("click", function () {
$("#authImg")[0].src += "?"
})
</script>

最新文章

  1. JAVA GUI随笔
  2. 【T-SQL系列】FOR XML PATH 语句的应用
  3. base64加密和解密
  4. EWM Matrai B2B管理平台
  5. Hibernate如何一个类映射两个表
  6. IE10-IE11在NET4.0下出现“__doPostBack未定义”解决方案
  7. javascript 精典案例分析一览
  8. SQL注入问题
  9. hdu_5768_Lucky7(中国剩余定理+容斥)
  10. 给新手--安装tomcat后username和password设置以及项目怎么部署在tomcatserver上
  11. scrapy---callback 传递自定义参数
  12. hdu 5392
  13. Oracle 巡检命令
  14. python基础 ------ 集合
  15. Python全栈之路----函数----高阶函数
  16. CoreCRM 开发实录 —— 基于 AntDesign 的新 UI
  17. web前端学习路线:HTML5教程之前端模块化开发
  18. Observer,观察者模式,C++描述
  19. WPF 分享一种背景动画效果
  20. grub2 详解

热门文章

  1. C++学习笔记(五)--指针、NULL、引用
  2. linux之shell脚本
  3. [BZOJ 3173] [TJOI 2013] 最长上升子序列(fhq treap)
  4. 接口测试工具——postman
  5. python 导入json模块的用法
  6. git把本地代码上传(更新)到github上
  7. python学习笔记(8):
  8. Python之路-初识python及环境搭建与测试(Python安装、Anaconda安装、PyCharm安装)
  9. linux详解 rsync 服务和配置文件
  10. qt 视频播放