前言
最近想玩字符型验证码的识别,想了下,爬取别人网站的验证码貌似不太好,索性自己生成自己识别好了,还省的标注什么的。
准备工作
我们需要python的一个用到图像处理库,PIL。在2.7以前,这个库是PIL。后面的就是Pillow了,我的是python3.6,所以装pillow
pip install Pillow
Pillow简单操作
创建图片,第一个参数是色彩模式,第二个是图片宽、高,第三个参数是背景色
from PIL import Image,ImageDraw,ImageFont,ImageFilter
image = Image.new('RGBA',(150,30),'white')
创建画笔,传入一张Image图片
draw = ImageDraw.Draw(image) #创建画笔
填充字符,第一个参数起始坐标点(左上),第二个参数为字符,第三个参数为字体,最后一个参数为字符颜色
draw.text((30,5),'A',font= font,fill='red') #填充字符
创建噪点,噪点实际上是一个圆,第一个参数为外切矩形,两个坐标点(左上,右下),第二个参数为线条颜色,第三个参数为填充颜色
draw.ellipse((x-1,y-1, x+1, y+1), 'black','black') #填充噪点
创建干扰线,干扰线为一条直线,第一个参数为起始点和终止点坐标,第二个参数是填充颜色,第三是线宽
draw.line([(0,0), (5,5)], fill = 'black',width=3)
生成验证码
#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#生成验证码存储路径
filename="e:/data/easy_img/"
#系统字体路径
font_path = 'C:/Windows/Fonts/Georgia.ttf'
#生成验证码的位数
number = 4
#生成验证码图片的高度和宽度
size = (130,55)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#是否要加入干扰线
draw_line = True
#图像中噪点数目
nois = 30
#随机选取一个字符
def gene_text():
# source = ['0','1','2','3','4','5','6','7','8','9']
source = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I','J', 'K','L', 'M', 'N','O','P','Q','R','S', 'T', 'U', 'V', 'W', 'Z','X', 'Y','0','1','2','3','4','5','6','7','8','9']
return ''.join(random.sample(source,1))
#随机选取一种颜色
def gene_color():
soure = [(0,0,0),(255,153,0),(255,0,0),(0,255,0),(0,0,255),(120,63,4)]
return random.sample(soure,1)
#绘制干扰线
def gene_line(draw,width,height):
linecolor = gene_color()[0]
begin = (0, random.randint(0, height))
end = (74, random.randint(0, height))
draw.line([begin, end], fill = linecolor,width=3)
#生成验证码
def gene_code():
width,height = size #宽和高
image = Image.new('RGBA',(width,height),bgcolor) #创建图片
font = ImageFont.truetype(font_path,40) #验证码的字体
draw = ImageDraw.Draw(image) #创建画笔
for i in range(number):
text = gene_text()#生成字符串
color = gene_color()
font_width, font_height = font.getsize(text)
#print(color[0],text)
draw.text((5+i*30,5),text,font= font,fill=color[0]) #填充字符
for i in range(nois):
x = random.randint(0,width-5)
y = random.randint(0,height-5)
draw.ellipse((x-1,y-1, x+1, y+1), 'black','black') #填充噪点
if draw_line:
gene_line(draw,width,height)
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜
postfix = str(".png")
path = filename + text + postfix
image.save(path)
if __name__ == "__main__":
x=1
while x<20:
gene_code()
x+=1