python生成图片验证码

一张验证码图片需要

  • 正确的答案字符绘制到图片中,随机生成
  • 增加难度
  • 绘制干扰线
  • 颜色随机
  • 绘制噪点
  • 模糊
  • 代码如下
import random
import string
import os
from PIL import Image, ImageFont, ImageDraw, ImageFilter  # 图像库


class ImageVerify:
    """图像验证码类"""

    def __init__(self, length=4, width=140, height=40, size=30):
        """
        初始化图片
        :param length: 字符个数
        :param width: 字符宽度
        :param height: 字符高度
        :param size: 字符大小
        """
        self.length = length
        self.width = width
        self.height = height
        self.size = size

    def random_str(self):
        """
        随机字符串
        26个大小写字母+10个数字作为数据源(将池)
        :return:
        """
        #
        source = string.ascii_letters + ''.join([str(i) for i in range(0, 10)])
        return ''.join(random.sample(source, self.length))

    def random_color(self, start=0, end=255):
        """随机RGB颜色"""
        res = (random.randint(start, end) for i in range(3))  # 产生的是一个生成器
        return tuple(res)

    def random_lines(self, draw):
        """
        绘制干扰线
        :param draw: 画笔
        :return:
        """
        for i in range(self.length):
            lines = [(random.randint(0, self.width), random.randint(0, self.height)) for i in range(2)]  # 循环两次得到两个点
            draw.line(list(lines), fill=self.random_color(50, 200), width=3)  # 线的两个点,线条颜色 ,线条宽度

    def random_points(self, draw, rate):
        """
        绘制噪点
        :param draw: 画笔
        :param rate: 频率
        :return:
        """
        for x in range(self.width):
            for y in range(self.height):
                if random.randint(1, 100) <= rate:
                    draw.point((x, y), fill=self.random_color(0, 200))  # 点色坐标,颜色

    def verify_code(self):
        """
        生成验证码图片
        :return:
        """
        # 创建画布.Image图像 底图
        image = Image.new('RGB', (self.width, self.height), (255, 255, 255))  # (颜色通道,(宽,高),(R,G,B))

        # 创建Font对象
        # os.path.abspath(__file__)返回文件绝对路径
        # os.path.dirname() 返回文件上一级路径
        file_path = os.path.dirname(os.path.abspath(__file__))
        font = ImageFont.truetype(f'{file_path}/HYYakuHei-85W.ttf', self.size)

        # 创建画笔对象
        draw = ImageDraw.Draw(image)  # 告诉这个笔我们在那个画布画画

        self.random_lines(draw)  # 自定义的随机线条
        self.random_points(draw, 10)  # 自定义的噪点

        # 验证码
        code = self.random_str()

        # 将验证码绘制到图片中
        for i in range(self.length):
            draw.text((random.randint(30, 35) * i, random.randint(0, 5)), code[i],
                      font=font, fill=self.random_color(0, 120))

        # 模糊滤镜
        image = image.filter(ImageFilter.BLUR)  # 模糊
        return image, code


if __name__ == '__main__':
    imageVerify = ImageVerify()
    image, code = imageVerify.verify_code()
    with open('test.png', 'wb') as fp:
        image.save(fp)  # 传入要保存的对象
    print(code)

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成验证码图片可以使用 Python 中的 Pillow 库和随机数库,具体步骤如下: 1. 导入需要的库: ```python from PIL import Image, ImageDraw, ImageFont import random ``` 2. 定义生成随机字符串的函数: ```python def generate_random_str(length): # 定义随机字符串的备选值 candidates = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' # 从备选值中随机选择指定长度的字符串 return ''.join(random.choices(candidates, k=length)) ``` 3. 定义生成验证码图片的函数: ```python def generate_verification_code(width, height, length): # 创建画布 image = Image.new('RGB', (width, height), color=(255, 255, 255)) # 创建画笔 draw = ImageDraw.Draw(image) # 设置字体 font = ImageFont.truetype('arial.ttf', size=30) # 生成随机字符串 code = generate_random_str(length) # 在画布上绘制字符串 for i in range(length): draw.text((10 + i * 20, 10), code[i], font=font, fill=random.choice([(0, 0, 0), (255, 0, 0), (0, 0, 255)])) # 添加干扰点 for i in range(100): draw.point((random.randint(0, width), random.randint(0, height)), fill=(0, 0, 0)) # 添加干扰线 for i in range(5): draw.line([(random.randint(0, width), random.randint(0, height)), (random.randint(0, width), random.randint(0, height))], fill=(0, 0, 0)) # 返回验证码图片和对应的字符串 return image, code ``` 4. 调用函数生成验证码图片: ```python image, code = generate_verification_code(120, 40, 4) image.show() ``` 以上代码中,`generate_random_str` 函数用于生成指定长度的随机字符串,`generate_verification_code` 函数用于生成指定宽度、高度和长度的验证码图片,并返回图片对象和对应的字符串。在绘制字符串时,使用了随机的字体颜色,以及添加了干扰点和干扰线,增加了验证码的复杂度。最后调用 `show` 方法显示生成的验证码图片。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值