pillow是Python平台事实上的图像处理标准库。PIL功能非常强大,但API却非常简单易用。 所以我们使用它在环境里做图像的处理。

第一步 下载pillow

#运行命令 pip install pillow

第二部 编写代码

1>创建一个类,初始化并为类添加属性

我们可能需要的属性有:验证码图片宽高,干扰点线数量,我们要出现多少个验证码等

2>随机生成背景颜色和字体颜色,在此建议将背景色生成范围定为浅色(0-120),字体色为深色(120-255)易于人眼识别

3>创建画布并依次画线点字,如果需要将字体倾斜旋转需要拷贝原图旋转再与原图合成

4>返回验证码图片和验证码答案字符串

例:

from PIL import Image,ImageDraw,ImageFont
import random
import io class code:
def __init__(self):
self.width=120 //生成验证码图片的宽度
self.height=40 //生成验证码图片的高度
self.im=None
self.lineNum=None //生成干扰线的数量
self.pointNum=None //生成干扰点的数量
self.codecon="QWERTYUPASDFGHJKZXCVBNMqwertyupadfhkzxcvbnm0123456789" //验证码出现的字符
self.codelen=4 //验证码出现字符的数量
self.str=""
def randBgColor(self):
return (random.randint(0,120),random.randint(0,120),random.randint(0,120))
def randFgColor(self):
return (random.randint(120, 255), random.randint(120, 255), random.randint(120, 255))
def create(self):
self.im = Image.new('RGB', size=(self.width, self.height), color=self.randBgColor())
def lines(self):
lineNum=self.lineNum or random.randint(3,6)
draw = ImageDraw.Draw(self.im)
for item in range(lineNum):
place=(random.randint(0,self.width),random.randint(0,self.height),random.randint(0,self.height),random.randint(0,self.height))
draw.line(place,fill=self.randFgColor(),width=random.randint(1,3))
def point(self):
pointNum = self.pointNum or random.randint(30, 60)
draw = ImageDraw.Draw(self.im)
for item in range(pointNum):
place=(random.randint(0,self.width),random.randint(0,self.height))
draw.point(place,fill=self.randFgColor())
def texts(self):
draw = ImageDraw.Draw(self.im)
for item in range(self.codelen):
x=item*self.width/self.codelen+random.randint(-self.width/15,self.width/15)
y=random.randint(-self.height/10,self.height/10)
text=self.codecon[random.randint(0,len(self.codecon)-1)]
self.str+=text
fnt = ImageFont.truetype('ARVO-REGULAR.TTF', random.randint(30,38))
draw.text((x,y),text,fill=self.randFgColor(),font=fnt,rotate="")
def output(self):
self.create()
self.texts()
self.lines()
self.point()
bt=io.BytesIO()
self.im.save(bt,"png")
return bt.getvalue()

5>将验证码渲染到网页中,以Flask为例

<img src="/codeimg" alt="" width="120" height="40">
@app.route('/codeimg')
def codeimg():
codeobj=code()
res=make_response(codeobj.output())
session["code"]=codeobj.str.lower()
res.headers["content-type"]="image/png"
return res

简单的输入式验证码就完成了,如有错误之处欢迎指正。

破解验证码时我们要用到第三方库。

解决思路:因为这种是最简单的一种验证码,只要识别出里面的内容,然后填入到输入框中即可。这种识别技术叫OCR,这里推荐使用Python的第三方库,tesserocr。对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片,先对图片进行灰度化,然后再进行二值化,再去识别,这样识别率会大大提高。

同样也可以参考使用pillow处理识别,链接https://blog.csdn.net/qq_35923581/article/details/79487579

使用Python生成基础验证码教程的更多相关文章

  1. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  2. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  3. python生成随机图形验证码

    使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...

  4. Python生成随机验证码,大乐透号码

    实例笔记之生成随机号码 扩展知识 - yield(生成器) 随机生成验证码 示例代码: import random # 导入标准模块中的random if __name__ == '__main__' ...

  5. python生成中文验证码,带旋转,带干扰噪音线段

    # -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...

  6. Python运算符 - Python零基础入门教程

    目录 一.算术运算符 二.赋值运算符 三.比较运算符 四.运算符的优先等级 五.重点总结 六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

  7. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  8. Python for循环 - Python零基础入门教程

    目录 一.for 循环语法 二.for 循环实战 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python ...

  9. python 生成图形验证码

    文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...

随机推荐

  1. elasticsearch 分片(Shards)的理解

    分片重要性 Es中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能.安全和稳定性, 所以很有必要了解一下它. 分片是什么? 简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块, ...

  2. linux系统上内网ip和和外网ip的关系

    1.不同服务之间的访问需要使用公网IP+端口才能访问 2.服务器上一般都是域名访问,服务器会把ip+端口映射成固定的域名,所以如果想访问服务器上其他应用,就必须的放开应用限制 问题,在服务器上放开对某 ...

  3. JSP知识汇总

    JSP知识汇总 一.简介 > HTML - HTML擅长显示一个静态的网页,但是不能调用Java程序. > Servlet - Servlet擅长调用Java程序和后台进行交互,但是它不擅 ...

  4. 服务器端 安装svn

    趁着这波比较闲的时候来划一波水,想起自己那都快生会的腾讯云服务器 到现在还不能通过版本控制系统上传文件,于是趁这波功夫在服务器上安装个svn来管理代码. 首先就简单的介绍一波 svn : 首先svn不 ...

  5. OS之内存管理 ---基本的内存管理策略(二)

    分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的 ...

  6. 堆排序(最大堆)的理解和实现(Java)

    堆的定义 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆:或者每个节点的值都小于或等于其左右孩子的值,称为小顶堆.如下图举例: 通过堆的定义可知,根节点一定是对中 ...

  7. 【转载】 C#中数组、ArrayList和List三者的区别

    原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...

  8. HTML编码规范 - 1

    用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双引号,绝不要使用单引号. 不要在自闭和(se ...

  9. php 数字 的简单加解密

    转载 <?php /** * 加密解密类 * 该算法仅支持加密数字.比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密. * @author 深秋的竹子 * @email 812 ...

  10. 【数组】Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...