PIL库制作验证码

目录

文章目录

前言

一、验证码的作用

二、使用步骤

1.安装PIL

2.生成随机字符串

3.生成验证码图片

总结


前言

验证码时网站为了防止恶意注册、发帖等而设置的验证手段。本文利用python中PIL库来将随机字符串写入图片,并增加干扰线、扭曲等效果,依次来实现验证码的制作。

一、验证码的作用

验证码时网站为了防止恶意注册、发帖等而设置的验证手段。其生成原理是将一串随机产生的数字或符号生成一幅图片,图片上加一些干扰像素(防止OCR)。下面介绍生成验证码的步骤。

二、使用步骤

1.安装PIL

通常,除了配置好python的环境外,还需要安装PIL库(专门用来处理图片的库)。PIL是Python语言的第三方库,PIL库支持图像的存储、显示和处理,能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条和文字等操作。

PIL库主要实现图像归档和图像处理两方面的功能需求。

  1. 图像归档:对图像进行批处理、生成图像预览、转换图像格式等。
  2. 图像处理:图像的基本处理、像素处理、颜色处理等。

安装PIL库的方法如下,需要安装的库的名字是pillow。安装指令如下:

pip install pillow

2.生成随机字符串

如果要生成验证码图片,首先需要生成一个随机字符串,包含26个字母和10个数字。

代码如下(示例):

#随机生成一个字符串
def gene_text():
    #source=list(string.letters)
    #source={'a','b','c','d','e','f','g','h','i','j','k','l','m',
    #        'n','o','p','q','r','s','t','u','v','w','x','y','z'}
    source=list(string.ascii_letters)
    for index in range(0,10):
        source.append(str(index))
    return ''.join(random.sample(source, number))  #number生成验证码的位数

3.生成验证码图片

生成验证码图片就是将上一步随机生成的字符串写入到图片中,需要注意的是这里面的字体不是系统而定的,如果没有找到系统字体路径,也可以不设置,接下来要在图片上画几条干扰线。最后创建扭曲,加上滤镜,用来增强验证码的效果。代码如下(示例):

# -*- coding: utf-8 -*-
import  random,string,sys,math
from PIL import Image,ImageDraw,ImageFont,ImageFilter

font_path="C:\Windows\Fonts\simfang.ttf"#字体路径
number=4 #生成验证码的位数
size=(80,30) #验证码图片的高、宽
bgcolor=(255,255,255) #背景颜色,默认为白色
fontcolor=(0,0,255) #字体颜色,默认为蓝色
linecolor=(255,0,0) #干扰线颜色,默认为红色
draw_line=True #是否加入干扰线
line_number=(1,5) #加入干扰线条数的上\下限

#随机生成一个字符串
def gene_text():
    #source=list(string.letters)
    #source={'a','b','c','d','e','f','g','h','i','j','k','l','m',
    #        'n','o','p','q','r','s','t','u','v','w','x','y','z'}
    source=list(string.ascii_letters)
    for index in range(0,10):
        source.append(str(index))
    return ''.join(random.sample(source, number))  #number生成验证码的位数

#用来绘制干扰线
def gene_line(draw,width,height):
    for i in range(random.randint(line_number[0],line_number[1])):
        begin=(random.randint(0, width),random.randint(0,height))
        end=(random.randint(0, width),random.randint(0,height))
        draw.line([begin,end],fill=linecolor)

#生成验证码
def gene_code():
    width,height=size #宽和高
    image=Image.new('RGBA', (width,height),bgcolor) #创建图片
    font=ImageFont.truetype(font_path,25) #验证码字体
    draw=ImageDraw.Draw(image) #创建画笔
    text=gene_text() #生成字符串
    #font_width,font_height=font.getsize(text) 
    _,_,font_width,font_height=font.getbbox(text) 
    draw.text(((width-font_width)/number,(height-font_height)/number),text,font=font,fill=fontcolor) #填充字符串
    if draw_line:
        gene_line(draw, width, height)
    image=image.transform((width+20,height+10),Image.AFFINE,(1,-0.3,0,-0.1,1,0),Image.BILINEAR) #创建扭曲
    image=image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
    image.save('idencode.png') #保存验证图片

if __name__=="__main__":
    gene_code()

结果如下:


总结

以上就是今天要讲的内容,本文介绍了如何利用python的PIL库来生成验证码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值