PIL 生成随机验证码

r囧r小猫 2023-02-12 03:28 48阅读 0赞

实现效果

随机验证码

  • 可以随机大小写字母、数字、中文字符
  • 模糊效果,如果觉得不合适,可以调节类 L_BLUR 的参数
  • 画的线只是辅助去看数字,没有任何意义

    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    from random import randint

    class L_BLUR(ImageFilter.BuiltinFilter):

    1. name = "l_blur"
    2. filterargs = (5, 5), 16, 0, (
    3. 1, 1, 1, 1, 1,
    4. 1, 0, 0, 0, 1,
    5. 1, 0, 0, 0, 1,
    6. 1, 0, 0, 0, 1,
    7. 1, 1, 1, 1, 1,
    8. )

    random.randint(M, N) 产生一个M到N的随机整数

    def rand_img_color():

    1. return randint(0,255), randint(0,255), randint(0,255)

    def rand_num_color():

    1. return randint(0,127), randint(0,127), randint(0,127)

    def rand_zh():

    1. return chr(randint(0x4E00,0x9FBF))

    def rand_char():

    1. # 小写字母
    2. return chr(randint(97,122))
    3. # 大写字母
    4. # return chr(randint(65,90))

    def rand_num():

    1. return str(randint(0,9))

    1.创建空图片

    image = Image.new(‘RGB’,(120,60),(255,255,255))
    draw = ImageDraw.Draw(image)

    2.渲染背景

    for x in range(0,120):

    1. for y in range(0,60):
    2. draw.point((x, y), rand_img_color())

    w, h = (image.size)
    draw.line((w/4,0) + (w/4,h), fill=rand_img_color(), width=3)
    draw.line((w/2,0) + (w/2,h), fill=rand_img_color(), width=3)
    draw.line((w/43,0) + (w/43,h), fill=rand_img_color(), width=3)
    draw.line((0,h/2) + (w,h/2), fill=rand_img_color(), width=3)
    image = image.filter(L_BLUR)

    3.渲染文字

    font = ImageFont.truetype(‘simhei.ttf’, 30)
    draw = ImageDraw.Draw(image)
    for x in range(4):

    1. y = randint(10,30)
    2. draw.text((30*x,y), rand_num(), rand_num_color(), font)

    image.show()

发表评论

表情:
评论列表 (有 0 条评论,48人围观)

还没有评论,来说两句吧...

相关阅读