#四位数数字字母验证码,显示进行输入判断验证
from PIL import Image, ImageFilter, ImageFont,ImageDraw
import os
import random
import string
import matplotlib.pyplot as plt
#  ImageFilter:Python中的图像滤波,主要对图像进行平滑、锐化、边界增强等滤波处理。
#随机选取一个数字字母,含大小写
def get_word():
    word = string.ascii_letters+string.digits
    return random.choice(word)
#字体像素随机颜色
def font_color():
    #random.randint()在范围内取随机数
    return(random.randint(32,255),random.randint(23,255),random.randint(32,255))
#背景像素随机颜色
def b_color():
    return(random.randint(64,255),random.randint(64,255),random.randint(64,255))
#生成验证码图像,返回一个字符串,表示验证码
def imag(path):
    w = 60*4
    h = 60
    d_word=''
    #新建图像对象
    img = Image.new('RGB',(w,h),(255,255,255))
    #字体对象
    font = ImageFont.truetype(r'H:\gay化\汉化\字体\4书法 - 2\FZ宋s刻d本r秀d楷繁.ttf',60)
    #类似于画笔
    draw = ImageDraw.Draw(img)
    for i in range(w):
        for j in range(h):
            #画背景,用随机颜色填充每个像素
            draw.point((i,j),fill=b_color())
    for i in range(4):
        word=get_word()
        #draw.text方法进行字符绘图,()内:绘图位置,字符,字体,颜色
        draw.text((i*60+10,5),word,font=font,fill=font_color())
        #单个验证码相加
        d_word = d_word + word
    #保存验证码图像
    img.save(path,'jpeg')
    #返回验证码
    return d_word
#一个输入函数,调用时返回输入内容
def get_input():
    return str(input('请输入验证码:\n'))
#运行
if __name__ == "__main__":
    path = ('test.jpg')
    str_=imag(path)
    test_img=Image.open(path)
    plt.figure('test')
    plt.imshow(test_img)
    plt.show()
    #四次机会
    for i in range(4):
        if str.lower(str_) == str.lower(get_input()):
            print('验证成功')
            break
        else:
            if i == 3:
                print('错误次数已用完!')
            else:
                print('错误!还有%d次机会'%(3-i))
    #结束后删除验证码图像
    os.remove(path)