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 13 Python
python插入数据到列表的方法
Apr 30 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
python如何读取bin文件并下发串口
Jul 05 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 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
用PHP读注册表
2006/10/09 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
python初步实现word2vec操作
2020/06/09 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
python实现视频压缩功能
2020/12/18 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
副校长竞聘演讲稿
2014/09/01 职场文书
学生党员检讨书范文
2014/12/27 职场文书
大学学生个人总结
2015/02/15 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android