您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

教你从零写一个验证码-Python图像处理实用练习

时间:2019-09-27 13:56:34  来源:  作者:

验证码是web开发中不可缺少的元素,而Python又提供了非常多的验证码模块帮助大家快速生成各种验证码。

那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对框架很熟悉就夸赞你。

那今天小胖就带大家一层一层拨开验证码的衣服,看看其中的小奥秘 -<-

私信小编01 获取此项目源码以及数十道PDF!

演示环境

- 操作系统:windows10

- python版本:python 3.7

- 代码编辑器:pycharm 2018.2

- 使用第三方模块:pillow

 

验证码的必须元素

1. 一张图片

2. 文本

3. 干扰元素

- 线条干扰

- 小圆点干扰

 

熟悉pillow库

我们既然需要使用pillow库制作验证码,那么首先我们先来熟悉一下我们需要用到的方法。

1. Image.new(): 这个方法可以生成一张图片,有三个参数。

- mode:颜色空间模式,可以是`'RGBA','RGB','L'`等等模式

- size:图片尺寸,接收一个两个整数的元祖

- color:图片的填充颜色,可以是`red,green`等,也可以是rgb的三个整数的元祖。也就是背景颜色

from PIL import Image
captcha = Image.new('RGB', (1080, 900), (255,255,255))

上面代码创建了一个亿RGB为颜色空间模式,尺寸为1080*900,背景颜色为白色的图片。

 

2. Image.save(): 保存图片到本地

- fp: 本地文件名

- format: 可选参数,制定文件后缀名。

from PIL import Image
captcha = Image.new('RGB', (1080, 900), (255,255,255))
# captcha.save('captcha.png')
captcha.save('captcha', format='png')

上面两种方式保存效果是一样的。

 

3. Image.show():显示图片,会调用电脑自带的显示图片的软件。

 

4. ImageFont.truetype(): 加载一个字体文件。生成一个字体对象。

from PIL import ImageFont
# 字体文件路径 字体大小
font = ImageFont.truetype('simkai.ttf', 16)

 

5. ImageDraw.Draw(): 生成画笔对象。

from PIL import Image, ImageDraw
captcha = Image.new('RGB', (1080, 900), 'red')
draw = ImageDraw.Draw(captcha)

上面就创建了一个在captcha这张图片上的画笔,我们在这个图片上画任何东西都会使用这个画笔对象。

 

6. ImageDraw.Draw().text():在图片上绘制给定的字符

from PIL import Image, ImageDraw, ImageFont
captcha = Image.new('RGB', (1080, 900), 'red')
font = ImageFont.truetype('simkai.ttf', 16)
draw = ImageDraw.Draw(captcha)
# 字符绘制位置, 绘制的字符, 制定字体, 字符颜色
draw.text((0,0), 'hello world', font=font, fill='black')

7. ImageDraw.Draw().line():在图片上绘制线条

from PIL import Image, ImageDraw, ImageFont
captcha = Image.new('RGB', (1080, 900), 'red')
draw = ImageDraw.Draw(captcha)
# 线条起点, 线条终点
draw.line([(0,0),(1080,900)], fill='black')

8. ImageDraw.Draw().point(): 在图片上绘制点

from PIL import Image, ImageDraw, ImageFont
captcha = Image.new('RGB', (1080, 900), 'red')
font = ImageFont.truetype('simkai.ttf', 16)
draw = ImageDraw.Draw(captcha)
# 点的位置, 颜色
draw.point((500,500), fill='black')

 

制作我们的验证码我们就会使用到上面的方法。当然,pillow肯定不止这些方法,这里我们就只列举这些了。

 

制作验证码

1. 首先我们定义一个类,初始化一些需要的参数。

import string
class Captcha():
 '''
 captcha_size: 验证码图片尺寸
 font_size: 字体大小
 text_number: 验证码中字符个数
 line_number: 线条个数
 background_color: 验证码的背景颜色
 sources: 取样字符集。验证码中的字符就是随机从这个里面选取的
 save_format: 验证码保存格式
 '''
 def __init__(self, captcha_size=(150,100), font_size=30,text_number=4, line_number=4, background_color=(255, 255, 255), sources=None, save_format='png'):
 self.text_number = text_number
 self.line_number = line_number
 self.captcha_size = captcha_size
 self.background_color = background_color
 self.font_size = font_size
 self.format = save_format
 if sources:
 self.sources = sources
 else:
 self.sources = string.ascii_letters + string.digits

这里说一下string模块。

- string.ascii_letters: 得到a-zA-Z所有字符

- string.digits: 得到0-9所有数字

 

2. 随机从sources获取字符

import random
def get_text(self):
 text = random.sample(self.sources,k=self.text_number)
 return ''.join(text)

random.sample()方法:从第一个参数中随机获取字符。获取个数有第二个参数指定。

 

3. 随机获取绘制字符的颜色

def get_font_color(self):
 font_color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
 return font_color

4. 随机获取干扰线条的颜色

def get_line_color(self):
 line_color = (random.randint(0, 250), random.randint(0, 255), random.randint(0, 250))
 return line_color

 

5. 编写绘制文字的方法

def draw_text(self,draw, text, font, captcha_width, captcha_height, spacing=20):
 '''
 在图片上绘制传入的字符
 :param draw: 画笔对象
 :param text: 绘制的所有字符
 :param font: 字体对象
 :param captcha_width: 验证码的宽度 
 :param captcha_height: 验证码的高度
 :param spacing: 每个字符的间隙
 :return: 
 '''
 # 得到这一窜字符的高度和宽度
 text_width, text_height = font.getsize(text)
 # 得到每个字体的大概宽度
 every_value_width = int(text_width / 4)
 # 这一窜字符的总长度
 text_length = len(text)
 # 每两个字符之间拥有间隙,获取总的间隙
 total_spacing = (text_length-1) * spacing
 if total_spacing + text_width >= captcha_width:
 raise ValueError("字体加中间空隙超过图片宽度!")
 # 获取第一个字符绘制位置
 start_width = int( (captcha_width - text_width - total_spacing) / 2 )
 start_height = int( (captcha_height - text_height) / 2 )
 # 依次绘制每个字符
 for value in text:
 position = start_width, start_height
 print(position)
 # 绘制text
 draw.text(position, value, font=font, fill=self.get_font_color())
 # 改变下一个字符的开始绘制位置
 start_width = start_width + every_value_width + spacing

6. 绘制线条的方法

def draw_line(self, draw, captcha_width, captcha_height):
 '''
 绘制线条
 :param draw: 画笔对象 
 :param captcha_width: 验证码的宽度 
 :param captcha_height: 验证码的高度
 :return: 
 '''
 # 随机获取开始位置的坐标
 begin = (random.randint(0,captcha_width/2), random.randint(0, captcha_height))
 # 随机获取结束位置的坐标
 end = (random.randint(captcha_width/2,captcha_width), random.randint(0, captcha_height))
 draw.line([begin, end], fill=self.get_line_color())

7. 绘制小圆点

def draw_point(self, draw, point_chance, width, height):
 '''
 绘制小圆点
 :param draw: 画笔对象
 :param point_chance: 绘制小圆点的几率 概率为 point_chance/100
 :param width: 验证码宽度
 :param height: 验证码高度
 :return:
 '''
 # 按照概率随机绘制小圆点
 for w in range(width):
 for h in range(height):
 tmp = random.randint(0, 100)
 if tmp < point_chance:
 draw.point((w, h), fill=self.get_line_color())

8. 制作验证码

def make_captcha(self):
 # 获取验证码的宽度, 高度
 width, height = self.captcha_size
 # 生成一张图片
 captcha = Image.new('RGB',self.captcha_size,self.background_color)
 # 获取字体对象
 font = ImageFont.truetype('simkai.ttf',self.font_size)
 # 获取画笔对象
 draw = ImageDraw.Draw(captcha)
 # 得到绘制的字符
 text = self.get_text(
 # 绘制字符
 self.draw_text(draw, text, font, width, height)
 # 绘制线条
 for i in range(self.line_number):
 self.draw_line(draw, width, height)
 # 绘制小圆点 10是概率 10/100, 10%的概率
 self.draw_point(draw,10,width,height)
 # 保存图片
 captcha.save('captcha',format=self.format)
 # 显示图片
 captcha.show()

这样,我们就生成了我们的图片验证码了,效果图:

 

教你从零写一个验证码-Python图像处理实用练习

 



Tags:Python 图像处理   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Pillow模块讲解一、Image模块1.1 、打开图片和显示图片就图片的处理最基础的操作就是打开这张图片,我们可以使用Image模块中的open(fp, mode)方法,来打开图片。open方法接收两...【详细内容】
2020-06-19  Tags: Python 图像处理  点击:(32)  评论:(0)  加入收藏
本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下:...【详细内容】
2020-06-12  Tags: Python 图像处理  点击:(65)  评论:(0)  加入收藏
10个常用的可以进行图像处理的Python库的介绍,可能有些你还没用过,可以试试看!...【详细内容】
2019-10-25  Tags: Python 图像处理  点击:(73)  评论:(0)  加入收藏
验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不...【详细内容】
2019-09-27  Tags: Python 图像处理  点击:(105)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条