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

【教你从零写一个验证码-Python图像处理实用练习】验证码是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 Imagecaptcha = Image.new('RGB', (1080, 900), (255,255,255))上面代码创建了一个亿RGB为颜色空间模式,尺寸为1080*900,背景颜色为白色的图片 。
 
2. Image.save(): 保存图片到本地
- fp: 本地文件名
- format: 可选参数,制定文件后缀名 。
from PIL import Imagecaptcha = 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, ImageDrawcaptcha = Image.new('RGB', (1080, 900), 'red')draw = ImageDraw.Draw(captcha)上面就创建了一个在captcha这张图片上的画笔,我们在这个图片上画任何东西都会使用这个画笔对象 。
 
6. ImageDraw.Draw().text():在图片上绘制给定的字符
from PIL import Image, ImageDraw, ImageFontcaptcha = 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, ImageFontcaptcha = 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, ImageFontcaptcha = 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 stringclass 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 randomdef get_text(self): text = random.sample(self.sources,k=self.text_number) return ''.join(text)random.sample()方法:从第一个参数中随机获取字符 。获取个数有第二个参数指定 。


推荐阅读