Python PIL实现图形验证码

需要安装的依赖库Pillow

pip install Pillow
import random
import base64
import string
from io import BytesIO
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageFilter



def check_code(width=80, height=32, char_length=6, font_file="font/Monaco.ttf", font_size=28):
    code = []
    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')

    def rndColor():
        """
        生成随机颜色
        :return:
        """
        return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

    # 写文字
    font = ImageFont.truetype(font_file, font_size)
    for i in range(char_length):
        char = random.choice(string.ascii_letters + string.digits)
        code.append(char)
        h = random.randint(0, char_length)
        draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

    # 写干扰点
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

    # 写干扰圆圈
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

    # 画干扰线
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)

        draw.line((x1, y1, x2, y2), fill=rndColor())

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    return img, ''.join(code)


def image_to_base64(img):
    output_buffer = BytesIO()
    img.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data)
    return str(base64_str, encoding="utf8")


if __name__ == '__main__':
    # 1. 直接打开
    img, code = check_code()
    img.show()

    # 2. 写入文件
    # img,code = check_code()
    # with open('code.png','wb') as f:
    #     img.save(f,format='png')

    # 3. 写入内存(Python3)
    # from io import BytesIO
    # stream = BytesIO()
    # img.save(stream, 'png')
    # stream.getvalue()
    pass


在使用的文件中引入该方法,使用redis存储验证码

img, captcha_code = check_code()

millis = int(round(time.time() * 1000))
salt = ''.join(random.sample(string.digits, 8))
code_key = f"{millis}{salt}"
redis_key = f"captcha_{code_key}"

# redis存储
_redis = app.redis 
await _redis.setex(redis_key, 600, captcha_code)

base64_img = image_to_base64(img)

最终生成的图形验证码

Python PIL实现图形验证码_第1张图片Python PIL实现图形验证码_第2张图片 

你可能感兴趣的:(Python,python,开发语言)