python 生成图形验证码的方法示例


Posted in Python onNovember 11, 2018

日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适合新手练习的,便于自己学习。

主要用到的库--PIL图像处理库,简单的思路,我们需要随机的颜色,随机的数字或字母,随机的线条、点作为干扰元素 拼凑成一张图片。

生成随机颜色,返回的是rgb三色。

def getRandomColor():
  r = random.randint(0, 255)
  g = random.randint(0, 255)
  b = random.randint(0, 255)
  return (r, g, b)

从数字、大小写字母里生成随机字符。

def getRandomChar():
  random_num = str(random.randint(0, 9))
  random_lower = chr(random.randint(97, 122)) # 小写字母a~z
  random_upper = chr(random.randint(65, 90)) # 大写字母A~Z
  random_char = random.choice([random_num, random_lower, random_upper])
  return random_char

图片操作,生成一张随机背景色的图片,随机生成5种字符+5种颜色,在图片上描绘字,由于默认的字体很小,还需要对字进行处理,不同系统下的字体文件存放位置不一样,这里我是把window下的 arial.ttf 字体复制到了当前文件夹下直接使用的。

# 图片宽高
width = 160
height = 50

def createImg():
  bg_color = getRandomColor()
  # 创建一张随机背景色的图片
  img = Image.new(mode="RGB", size=(width, height), color=bg_color)
  # 获取图片画笔,用于描绘字
  draw = ImageDraw.Draw(img)
  # 修改字体
  font = ImageFont.truetype(font="arial.ttf", size=36)
  for i in range(5):
    # 随机生成5种字符+5种颜色
    random_txt = getRandomChar()
    txt_color = getRandomColor()
    # 避免文字颜色和背景色一致重合
    while txt_color == bg_color:
      txt_color = getRandomColor()
    # 根据坐标填充文字
    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
  # 打开图片操作,并保存在当前文件夹下
  with open("test.png", "wb") as f:
    img.save(f, format="png")

这个时候可以看到文件夹下面的图片

python 生成图形验证码的方法示例

这里是张很清晰的图片,为了有干扰元素,这里还需要在图片加入些线条、点作为干扰点。

随机画线,在图片宽高范围内随机生成2个坐标点,并通过随机颜色产生线条。

def drawLine(draw):
  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.line((x1, y1, x2, y2), fill=getRandomColor())

随机画点,随机生成横纵坐标点。

def drawPoint(draw):
  for i in range(50):
    x = random.randint(0, width)
    y = random.randint(0, height)
    draw.point((x,y), fill=getRandomColor())

生成方法

def createImg():
  bg_color = getRandomColor()
  # 创建一张随机背景色的图片
  img = Image.new(mode="RGB", size=(width, height), color=bg_color)
  # 获取图片画笔,用于描绘字
  draw = ImageDraw.Draw(img)
  # 修改字体
  font = ImageFont.truetype(font="arial.ttf", size=36)
  for i in range(5):
    # 随机生成5种字符+5种颜色
    random_txt = getRandomChar()
    txt_color = getRandomColor()
    # 避免文字颜色和背景色一致重合
    while txt_color == bg_color:
      txt_color = getRandomColor()
    # 根据坐标填充文字
    draw.text((10 + 30 * i, 3), text=random_txt, fill=txt_color, font=font)
  # 画干扰线点
  drawLine(draw)
  drawPoint(draw)
  # 打开图片操作,并保存在当前文件夹下
  with open("test.png", "wb") as f:
    img.save(f, format="png")

最终生成的图片

python 生成图形验证码的方法示例

这里介绍的是图片生成的方法,可以将图片直接显示在前端,也可以使用接口返回url。用Django做的,需要注意的是图片保存的路径。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python文件操作相关知识点总结整理
Feb 22 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
python实现转圈打印矩阵
Mar 02 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
python 实现多维数组(array)排序
Feb 28 Python
Python使用pdb调试代码的技巧
May 03 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
python实现数字炸弹游戏
Jul 17 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
Python实现归一化算法详情
Mar 18 Python
老生常谈python中的重载
Nov 11 #Python
Django跨域请求CSRF的方法示例
Nov 11 #Python
Python rstrip()方法实例详解
Nov 11 #Python
python requests爬取高德地图数据的实例
Nov 10 #Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 #Python
Python中的取模运算方法
Nov 10 #Python
在Python中获取两数相除的商和余数方法
Nov 10 #Python
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
php compact 通过变量创建数组
2016/11/15 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
类之Prototype.js学习
2007/06/13 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
拖动时防止选中
2017/02/03 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
NestJs 静态目录配置详解
2019/03/12 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Python中一般处理中文的几种方法
2019/03/06 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
大二法学专业职业生涯规划范文
2014/02/12 职场文书
公益广告宣传方案
2014/02/28 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
民事上诉状范文
2015/05/22 职场文书
趣味运动会加油词
2015/07/18 职场文书