python实现图片验证码

这里记录一下图片验证码的简单实现 

import string
import random
from PIL import Image, ImageDraw,ImageFont

def get_captcha_string(number, has_letters=True):
    # 判断是否需要包含字母
    if has_letters:
        source = list(string.ascii_letters + string.digits)
    else:
        source = list(string.digits)
    chars = ""
    for i in range(number):
        chars += random.choice(source)
    return "".join(chars)


class GraphCaptcha(object):
    number = 4
    # 验证码图片长宽
    width = 100
    height = 30
    # 验证码文字大小
    fontsize = 32


    @classmethod
    def __random_color(cls, start=0, end=255):
        return (random.randint(start, end), random.randint(start, end),
                random.randint(start, end))

    @classmethod
    def __random_font(cls):
        fonts = [
            "framd.ttf",
            "framdit.ttf",
            "verdana.ttf",
            "verdanai.ttf"
        ]
        font = random.choice(fonts)
        return 'captcha/'+font

    @classmethod
    def __set_point(cls, draw):
        for w in range(cls.width):
            for h in range(cls.height):
                draw.point((w, h), fill=cls.__random_color())

    @classmethod
    def get_captcha(cls):
        image = Image.new("RGB", (cls.width, cls.height), (255, 255, 255))

        draw = ImageDraw.Draw(image)

        cls.__set_point(draw)
        text = get_captcha_string(number=cls.number)
        font = ImageFont.truetype('verdana.ttf', cls.fontsize)
        font_width, font_height = font.getsize(text)
        draw.text(((cls.width - font_width) / 2,
                   (cls.height - font_height) / 2), text, font=font,
                  fill=cls.__random_color(start=32, end=127))

        return text,image

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困带着迷茫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值