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的导入 ...
随机推荐
- 几种常见排序算法的基本介绍,性能分析,和c语言实现
本文介绍6种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚,本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换 ...
- Linux 内核设备属性
sysfs 中的设备入口可有属性. 相关的结构是: struct device_attribute { struct attribute attr; ssize_t (*show)(struct de ...
- Yet Another Array Queries Problem CodeForces - 863D (暴力/思维)
You are given an array a of size n, and q queries to it. There are queries of two types: 1 li ri — p ...
- Jmeter配置元件——CSV DataSet Config参数化
在聊CSV DataSet Config配置元件前,先来讨论下为何要参数化? 比如在做性能测试过程中, 一般我们需要模拟多个用户进行操作, 为了满足实际场景, 模拟真实的用户行为, 我们需要做到模拟的 ...
- Dart常见类型转换 Int String Double
int -> string age.toString() string -> int int.parse('100'); String -> double var onePointO ...
- [reviewcode] 那些基础comments
多次提醒我,为变量取个合适的名字, so cute person: Not a big deal, but try using variable names better than my_sa 每个参 ...
- 对sql server查询速度的优化
处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...
- 洛谷$P4126\ [AHOI2009]$最小割 图论
正解:网络流+$tarjan$ 解题报告: 传送门$QwQ$ $umm$最小割的判定问题$QwQ$,因为并不会做是看的题解才会的,所以也没什么推导过程直接放结论趴$QwQ$ 首先跑个最大流,然后有. ...
- 1026 程序运行时间 (15 分)C语言
题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tic ...
- CSRF 详解:攻击,防御,Spring Security应用等
本文原创,更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. CSRF(Cross-site request forgery跨站请求伪造,也被称成为"one click att ...