python生成一个验证码图片

    技术2026-04-09  5

    目录

    一. 什么是PIL二. 安装PIL模块三.生成验证码1. 生成随机字母2. 生成随机颜色3.获取验证码图片4.封装代码

    一. 什么是PIL

    PIL:是Python Image Library的缩写,图像处理的模块。主要的类包括Image,ImageFont,ImageDraw,ImageFilter

    二. 安装PIL模块

    pip install Pillow

    然后就可以调用类:

    from PIL import Image, ImageDraw, ImageFont, ImageFilter

    三.生成验证码

    1. 生成随机字母

    def rndChar(): """生成随机字母""" return chr(random.randint(65, 90))

    2. 生成随机颜色

    def rndColor(): """生成随机颜色(RGB格式)""" r = random.randint(0, 255) g = random.randint(0, 255) b = random.randint(0, 255) return (r ,g ,b)

    3.获取验证码图片

    def check_code(width=120, height=30, char_length=5, font_file='Monaco.ttf', font_size=28): code = [] # 获取一个Image对象,参数分别是RGB模式。宽120,高30,颜色为白色 img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255)) # 获取一个画笔对象,将图片对象传过去 draw = ImageDraw.Draw(img, mode='RGB') # 写文字 # 获取字体以及字体大小 font = ImageFont.truetype(font_file, font_size) for i in range(char_length): char = rndChar() code.append(char) h = random.randint(0, 4) 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)

    4.封装代码

    from PIL import Image, ImageDraw, ImageFont, ImageFilter import random def check_code(width=120, height=30, char_length=5, font_file='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 rndChar(): """ 生成随机字母 :return: """ return chr(random.randint(65, 90)) 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 = rndChar() code.append(char) h = random.randint(0, 4) 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) if __name__ == '__main__': img = ValidCodeImg() image_object, code = img.check_code() print(code) # 把图片写入文件 """ with open('code.png', 'wb') as f: image_object.save(f, format='png') """ """ # 把图片的内容写到内存 stream from io import BytesIO stream = BytesIO() image_object.save(stream, 'png') stream.getvalue() """
    Processed: 0.014, SQL: 10