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辅助软件思路及图像识别源码解析
Jan 04 Python
解决DataFrame排序sort的问题
Jun 07 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python3匿名函数用法示例
Jul 25 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
python 常见的反爬虫策略
Sep 27 Python
python logging模块的使用详解
Oct 23 Python
python爬虫中的url下载器用法详解
Nov 30 Python
python 实现逻辑回归
Dec 30 Python
python如何正确使用yield
May 21 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
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
php实现天干地支计算器示例
2014/03/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
取得传值的函数
2006/10/27 Javascript
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
在python shell中运行python文件的实现
2019/12/21 Python
python scatter函数用法实例详解
2020/02/11 Python
什么是Python变量作用域
2020/06/03 Python
使用python实现名片管理系统
2020/06/18 Python
日语求职信范文
2013/12/17 职场文书
成立公司计划书
2014/05/07 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS