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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
vc6编写python扩展的方法分享
Jan 17 Python
Python open()文件处理使用介绍
Nov 30 Python
Python中使用PIPE操作Linux管道
Feb 04 Python
Python设计模式之抽象工厂模式
Aug 25 Python
python简单实现获取当前时间
Aug 27 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
Python3批量创建Crowd用户并分配组
May 20 Python
Python的collections模块真的很好用
Mar 01 Python
python 中的@运算符使用
May 26 Python
Python实现科学占卜 让视频自动打码
Apr 09 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
神族 Protoss 历史背景
2020/03/14 星际争霸
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
python支持多线程的爬虫实例
2019/12/21 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
医药工作者的求职信范文
2013/09/21 职场文书
出纳岗位职责范本
2013/12/01 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
电子商务专业求职信
2014/03/08 职场文书
python缺失值填充方法示例代码
2022/12/24 Python