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正规则表达式学习指南
Aug 02 Python
详解Python的Lambda函数与排序
Oct 25 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
jupyter notebook清除输出方式
Apr 10 Python
python修改微信和支付宝步数的示例代码
Oct 12 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
php实现每日签到功能
2018/11/29 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
解决jquery版本冲突的有效方法
2014/09/02 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
简述Python中的面向对象编程的概念
2015/04/27 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
对python的输出和输出格式详解
2018/12/08 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
Python 实现简单的客户端认证
2020/07/29 Python
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
学校运动会广播稿范文
2014/10/02 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
保研推荐信范文
2015/03/25 职场文书
文明礼貌主题班会
2015/08/14 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书