Django 生成验证码或二维码 pillow模块
- PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,API也非常简单易用。
PIL模块只支持到Python 2.7,许久没更新了,在python 3.* 版本上使用Pillow模块
安装Pillow
pip install pillow
- 图像缩放
from PIL import Image
# 当前路径打开一个jpg图像文件
img = Image.open('test.jpg')
# 获得图像尺寸:
w, h = img.size
print('图片长宽: {}-{}' .format(w, h))
# 缩放到50%:
img.thumbnail((w//2, h//2))
print('缩小50%: {}-{}'.format(w//2, h//2))
# 把缩放后的图像用jpeg格式当前路径保存:
img.save('myimg.jpg', 'jpeg')
- 切片、旋转、滤镜、输出文字、调色板等一应俱全。
比如,模糊效果也只需几行代码:
from PIL import Image, ImageFilter
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
- 生成验证码及验证码图片
#vericode.py
import random
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageFilter
def get_chars_str():
'''
:return:验证码字符集合
'''
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
return init_chars
def create_validate_code(size=(120, 30),
chars=get_chars_str(),
img_type="JPEG",
mode="RGB",
bg_color=(255, 255, 255),
fg_color=(0, 0, 255),
font_size=18,
font_type=r"E:\myblog\utils\Arial.ttf", #我的是全路径 可以自己使用 os 模块自动拼接 没有字体去下载 Arial.ttf字体
length=4,
draw_lines=True,
n_line=(1, 2),
draw_points=True,
point_chance=2):
"""
生成验证码图片
:param size: 图片的大小,格式(宽,高),默认为(120, 30)
:param chars: 允许的字符集合,格式字符串
:param img_type: 图片保存的格式,默认JPEG,可选的为GIF,JPEG,TIFF,PNG
:param mode: 图片模式,默认为RGB
:param bg_color: 背景颜色,默认为白色
:param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
:param font_size: 验证码字体大小
:param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
:param length: 验证码字符个数
:param draw_lines: 是否划干扰线
:param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
:param draw_points: 是否画干扰点
:param point_chance: 干扰点出现的概率,大小范围[0, 100]
:return: [0]: PIL Image实例
:return: [1]: 验证码图片中的字符串
"""
width, height = size # 宽高
# 创建图形
img = Image.new(mode, size, bg_color)
draw = ImageDraw.Draw(img) # 创建画笔
def get_chars():
"""生成给定长度的字符串,返回列表格式"""
return random.sample(chars, length)
def create_lines():
"""绘制干扰线"""
line_num = random.randint(*n_line) # 干扰线条数
for i in range(line_num):
# 起始点
begin = (random.randint(0, size[0]), random.randint(0, size[1]))
# 结束点
end = (random.randint(0, size[0]), random.randint(0, size[1]))
draw.line([begin, end], fill=(0, 0, 0))
def create_points():
"""绘制干扰点"""
chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
for w in range(width):
for h in range(height):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=(0, 0, 0))
def create_strs():
"""绘制验证码字符"""
c_chars = get_chars()
strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开
font = ImageFont.truetype(font_type, font_size)
font_width, font_height = font.getsize(strs)
draw.text(((width - font_width) / 3, (height - font_height) / 3),
strs, font=font, fill=fg_color)
return ''.join(c_chars)
if draw_lines:
create_lines()
if draw_points:
create_points()
strs = create_strs()
# 图形扭曲参数
params = [1 - float(random.randint(1, 2)) / 100,
0,
0,
0,
1 - float(random.randint(1, 10)) / 100,
float(random.randint(1, 2)) / 500,
0.001,
float(random.randint(1, 2)) / 500
]
img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
return img, strs
- 验证码请求url 为: path("check-code.html", views.check_code),
from io import BytesIO
from django.shortcuts import HttpResponse
def check_code(request):
"""返回验证码图片"""
image, code = create_validate_code(size=(80,30))
f = BytesIO()
request.session["check_code"] = code
request.session.set_expiry(30)
image.save(f,"JPEG") #保存图片
return HttpResponse(f.getvalue()) #返回图片
<div class="" style="width: 275px;height: 50px;">
验证码:<br />
<input Class="validate" id="check_code" name="check_code" style="width:60px;height: 9px;" type="text" placeholder="验证码" />
<img id="idf_img" src="/blog/check-code.html" style="float: right; width: 60px; height: 24px; padding-top: 7px;"/>
</div>
import qrcode
参数含义:
参数 version 表示生成二维码的尺寸大小,取值范围是 1 至 40,
最小尺寸 1 会生成 21 * 21 的二维码,version 每增加 1,生成的二维码就会添加 4 尺寸,
例如 version 是 2,则生成 25 * 25 的二维码。
参数 error_correction 指定二维码的容错系数,分别有以下4个系数:
1.ERROR_CORRECT_L: 7%的字码可被容错
2.ERROR_CORRECT_M: 15%的字码可被容错
3.ERROR_CORRECT_Q: 25%的字码可被容错
4.ERROR_CORRECT_H: 30%的字码可被容错
可以生成二维码图片,根据参数
参数 box_size 表示二维码里每个格子的像素大小。
参数 border 表示边框的格子厚度是多少(默认是4)。
def create_qr_code(data, version=7, box_size=10, border=4):
"""
生成普通二维码
:param data: 你要生成二维码的数据,如 url 网址 或者 "我爱你成元"
:return: img 返回的是图片,如果需要保存就 image.save()
"""
qr = qrcode.QRCode(
version=version,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=box_size,
border=border
)
qr.add_data(data)
#qr.add_data("我爱你成元")
qr.make(fit=True)
img = qr.make_image()
return img
- from PIL import Image
import qrcode
from PIL import Image
import qrcode
- data 第一个参数为二维码内容, path 第二个参数将要添加到中间的图片路径
def create_mid_pic_code(data, path):
"""
生成中间带图片的二维码
:param data: 二维码内容
:param path: 将要放在二维码中间的图片路径
:return: img 返回制作好的图片
"""
qr = qrcode.QRCode(
version=4,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=2
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image()
img = img.convert("RGBA")
# 打开要添加的图片文件对象
picture = Image.open(path)
img_w, img_h = img.size
factor = 4
size_w = int(img_w / factor)
size_h = int(img_h / factor)
picture_w, picture_h = picture.size
if picture_w > size_w:
picture_w = size_w
if picture_h > size_h:
picture_h = size_h
picture = picture.resize((picture_w, picture_h), Image.ANTIALIAS)
w = int((img_w - picture_w) / 2)
h = int((img_h - picture_h) / 2)
img.paste(picture, (w, h), picture)
return img
Django 生成验证码或二维码 pillow模块的更多相关文章
- Java生成、解析二维码
今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...
- 使用Google提供的ZXing Core,Java生成、解析二维码
1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...
- Java生成与解析二维码
1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...
- Java 验证码、二维码
Java 验证码.二维码 资源 需要: jelly-core-1.7.0.GA.jar网站: http://lychie.github.io/products.html将下载下来的 jelly ...
- asp.net.web如何简单生成和保存二维码图片的例子
首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序
- python实现树莓派生成并识别二维码
python实现树莓派生成并识别二维码 参考来源:http://blog.csdn.net/Burgess_Liu/article/details/40397803 设备及环境 树莓派2代 官方系统R ...
- ZXing 生成、解析二维码图片的小示例
概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...
- JAVA中生成、解析二维码图片的方法
JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...
- 微信公众号开发C#系列-11、生成带参数二维码应用场景
1.概述 我们在微信公众号开发C#系列-7.消息管理-接收事件推送章节有对扫描带参数二维码事件的处理做了讲解.本篇主要讲解通过微信公众号开发平台提供的接口生成带参数的二维码及应用场景. 微信公众号平台 ...
随机推荐
- mysql 数据库 命令行的操作——对库的操作
1.查看所有数据库 show databaese; 2.查看当前所用的数据库 show databases(): 3.切换数据库 use(数据库名): 4.创建数据库 create database ...
- Servlet(二):初识Servlet
在手动写完一个Servlet小例子后,是不是有很多疑问,接下来会为大家详细介绍Servlet的知识. 1.什么是Servlet 是在服务器上运行的小程序.一个servlet就是一个Java类,并且可以 ...
- 如何写 go 代码 (How to Write Go Code 翻译)
目录 1. 写在前面的话 2. 介绍 3. 代码组织 3.1. 工作区 3.2. GOPATH 环境变量 3.3. Package 路径 3.4. 第一个 GO 程序 3.5. 第一个 GO 库 3. ...
- JavaScript的基本包装类型概述与基本包装类型_Number类型
JavaScript的基本包装类型示例 为了便于操作基本类型值,javaScript 提供了 3 个特殊的引用类型:Boolean.Number和 String. 这些类型与其他引用类型相似,但同时也 ...
- MySQL高级知识(二)——Join查询
前言:该篇主要对MySQL中join语句的七种情况进行总结. 0.准备 join主要根据两表或多表之间列的关系,从这些表中进行数据的查询. 首先创建两张表:tb_emp(员工表)和tb_dept(部门 ...
- java发送163邮件
在服务挂掉后,可以采用发送邮件的方式来通知开发人员进行异常处理 import java.io.IOException; import java.util.Properties; import java ...
- 为了下载和使用最新的git,只好安装了迅雷
一 安装迅雷时总感觉它的图标像是灰鸽子,让人不放心. 从https://git-scm.com/downloads上找到64-bit Git for Windows Setup的地址: https: ...
- 阿里巴巴的26款超神Java开源项目,有时间阅读一下各个文档,增添一下知识广度
1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务的 ...
- 【vue】vue +element 搭建项目,在使用InputNumber 计数器时遇到的问题
自己遇到的坑: InputNumber 计数器的change事件定义时如果不传入参数value,会产生this.num不同步的问题 <template> <el-input-numb ...
- Python学习笔记(2)-字典
什么是字典? 像列表一样,但是不能想列表用下表索引,而是通过'键',键及其关联的值称为'键-值'对.字典经常会简写成dict 创建字典{} 例如: >>> dict = {'one' ...