Djaingo 随机生成验证码(PIL)
基础: https://www.cnblogs.com/wupeiqi/articles/5812291.html
实例: https://www.cnblogs.com/6324TV/p/8811249.html
一、安装PIL模块
pip install pillow
二、调用PIL的类
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from PIL import ImageFilter
三、常用方法
1、创建空白图片
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
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、创建画笔,用于在图片上画任意内容
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')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示字体
draw.text([0, 0], 'python', fill="red", font=font)
四、储存位置
# 注意 这里的check_code()是一个函数,第一个返回值是图片,第二个是内容
# 1.直接打开
img,code = check_code()
img.show() # 2. 写入文件
img,code = check_code()
with open('code.png','wb') as f:
img.save(f,format='png') # 3. 写入内存(Python3)
from io import BytesIO
stream = BytesIO()
img.save(stream, 'png')
stream.getvalue() # 4. 写入内存(Python2)
import StringIO
stream = StringIO.StringIO()
img.save(stream, 'png')
stream.getvalue()
五、例子
生成图片颜色随机的验证码(大写字母、小写字母,数字),含噪点和噪线
# 获取验证码图片
def get_valid_img(request):
from PIL import Image, ImageDraw, ImageFont
import random # 获取随机的颜色
def get_random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) # 随机获取大写字母、小写字母、数字
def get_random_str():
rand_num = str(random.randint(0, 9)) # 注意:int->str
rand_low_alpha = chr(random.randint(97, 122))
rand_upper_alpha = chr(random.randint(65, 90))
rand_char = random.choice([rand_num, rand_low_alpha, rand_upper_alpha])
return rand_char # 创建图片对象 模式、大下、颜色
img_obj = Image.new(mode='RGB',
size=(220, 35),
color=get_random_color()
)
# 创建画笔
draw_obj = ImageDraw.Draw(img_obj)
# 创建字体对象,字体文件路径,字体大小
font_obj = ImageFont.truetype("static/font/kumo.ttf", 28)
# 存储随机生成的str
temp_list = []
for i in range(5):
# 循环5次,获取5个随机字符串
random_char = get_random_str()
temp_list.append(random_char)
# 在图片上一次写入得到的随机字符串,参数是:定位,字符串,颜色,字体,定位根据图片的大下绝定
draw_obj.text((20+40*i, 0), random_char, get_random_color(), font=font_obj)
# 验证码
vail_code = "".join(temp_list)
print(vail_code) # 打印随机字符串
# 将验证码存在Session中
request.session['vail_code'] = vail_code
# 噪点噪线, 防止越界
width = 220
height = 35
# 划线
for i in range(5):
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw_obj.line((x1, y1, x2, y2), fill=get_random_color()) # 画点 40 是根据随机字符串的定位,及图片的宽度
for i in range(40):
draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())
# 写入内存
from io import BytesIO
io_obj = BytesIO()
# 将生成的图片数据保存在io对象中
img_obj.save(io_obj, "png")
# 从io对象里面取上一步保存的数据
data = io_obj.getvalue()
return HttpResponse(data)
Djaingo 随机生成验证码(PIL)的更多相关文章
- Python随机生成验证码的两种方法
Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种 ...
- Android锁定EditText内容和随机生成验证码
昨天写了个小Demo,实现了随机生成验证码,和锁定EditText两个小功能,先看一下效果图: 锁定EditText在我们不须要用户编辑EditText内容的时候能够用到,实现还是非常easy的,一行 ...
- 随机生成验证码及python中的事务
1.随机生成验证码 # import random # print(random.random()) #-1的小数 # print(random.randint(,)) #包括1和3 # print( ...
- js随机生成验证码以及随机颜色
Javascript通过Math.random()随机生成验证码. 代码如下: <!DOCTYPE html><html> <head> <meta char ...
- 随机生成验证码(JS)
效果展示 实现原理 1. html:一般就是一个div: <div id="code"></div> ,样式根据需求设计. 2. JS:1)将所有的验证码所 ...
- php随机生成验证码代码
<?php session_start(); //产生一个随机的字符串验证码 $checkcode=""; for ($i=0;$i<4;$i++){ $checkco ...
- .Net (MVC) 随机生成验证码
以前一直对C#的GDI画图部分知识点不怎么用所以忘得差不多了,这两天正好公司要做一个博客系统,其中一个需求就是留言时为了防止恶意攻击必须填写验证码,正好借着这个机会复习了一下,以下是实现代码,写的比较 ...
- js随机生成验证码及其颜色
今天迎来了2018年第一场雪,这个美好的日子,总的写点什么纪念一下,在这里写了一个在js中使用Math.random()函数,随机生成四位数的验证码及其验证码换颜色. js代码如下: var arra ...
- Django随机生成验证码图片
PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...
随机推荐
- Redis 命令行工具能这样用你知道了吗?
我们天天都在使用 Redis 内置的命令行工具 redis-cli,久而久之以为它就是一个简单的交互式 Redis 数据结构手工操作程序,但是它背后强大的功能绝大多数同学可能闻所未闻.本节我们一起来挖 ...
- linux Do-it-yourself 探测
探测也可以在驱动自身实现没有太大麻烦. 它是一个少有的驱动必须实现它自己的探测, 但是看它是如何工作的能够给出对这个过程的内部认识. 为此目的, short 模块进行 do- it-yourself ...
- es6笔记 day3---数组新增东西
Array.from()的作用就是把类数组转成数组.所谓类数组,就是有长度的数组 ----------------------------------------------------------- ...
- vue 父组件中调用子组件函数
2019/06/06 在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数.eg: u ...
- JNI相关使用记录
JNI 工作流程 java层调用system.load方法. 通过classloader拿到了so文件的绝对路径,然后调用nativeload()方法. 通过linux下的dlopen方法,加载并查找 ...
- KEIL5.11安装小结
一.注意点 1.安装路径不能带中文,必须是英文路径 2.安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开 3.KEIL5 不像 KEIL4 那样自带了很多厂商的 MCU 型 ...
- Elasticsearch慢查询故障诊断
最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考. 在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler ...
- jquery简单实现复选框的全选与反选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux下安装MariaDB数据库
搜素某个文件:find / -name '文件名(或文件夹名)' 1.编辑yum源:vi /etc/yum.repos.d/MariaDB.repo 2.编辑文件时用到的vi命令: vi 打开一个不存 ...
- 如何查看linux是否打开虚拟化
[服务器虚拟化] 执行命令: cat /proc/cpuinfo |grep vmx 如果有输出,则说明CPU支持虚拟化技术. --------> svm - Secure virtua ...