python生成字符型验证码

前言

最近想玩字符型验证码的识别,想了下,爬取别人网站的验证码貌似不太好,索性自己生成自己识别好了,还省的标注什么的。

准备工作

我们需要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

最终效果

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值