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 实现插入排序算法
Jun 05 Python
Python获取apk文件URL地址实例
Nov 01 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
python执行使用shell命令方法分享
Nov 08 Python
python实现聊天小程序
Mar 13 Python
python代码过长的换行方法
Jul 19 Python
python执行精确的小数计算方法
Jan 21 Python
python对验证码降噪的实现示例代码
Nov 12 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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电台频率大全 - 15 山东省
2020/03/11 无线电
JS 网站性能优化笔记
2011/05/24 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 闭包的使用方法
2017/09/07 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
python中判断文件结束符的具体方法
2020/08/04 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
检查接待方案
2014/02/27 职场文书
个人批评与自我批评
2014/10/15 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技
Nginx的gzip相关介绍
2022/05/11 Servers