使用python的pillow库生成图像验证码

一、pillow库

Pillow库:是一个功能强大的Python图像处理库,它提供了丰富的图像处理功能,使得用户能够方便地使用Python对图像进行各种操作。

二、图像验证码的分析

首先需要一个图像,图像上需要绘制验证码,还需要任意多的点和几条线来造成干扰即可。

三、实现
1、安装pillow库:pip install pillow 

使用一个类来实现图像验证码的生成

 2、构造方法__init__,  初始化图像的宽、高,验证码字符长度、以及字体的大小。

3、随机生成length长的字符串

4、随机生成颜色

5、随机生成线

6、随机生成点

7、生成验证码图像,调用上面编写好的方法

四、效果展示
 

五、代码
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import string

class ImageVerify:
    def __init__(self, length=4, width=100, height=50, size=18):
        self.length = length  # 验证码字符串的长度
        self.width = width  # 图片的宽
        self.height = height  # 图片的高
        self.size = size  # 字体的大小

    # 随机生成字符串
    def random_str(self):
        # string.ascii_letters包含字母的大小写,值为abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
        # source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
        source = string.ascii_letters + '0123456789'
        # 随机从source中获取length个不重复的元素,然后拼接
        return ''.join(random.sample(source, self.length))

    # 随机生成颜色
    def random_color(self, start=0, end=255):
        # 元组推导式,(a, b, c), a, b, c默认范围为0~255, 就是RGB
        res = (random.randint(start, end) for i in range(3))
        return tuple(res)

    # 随机生成线
    def random_lines(self, draw):
        #  在图片上随机位置上生成4条线
        for i in range(self.length):
            # 生成一个带有两个元组元素的列表,第一个元组表示线的开始坐标,第二个元组表示线的结束坐标
            lines = [(random.randint(0, self.width), random.randint(0, self.height)) for i in range(2)]
            # line方法用来绘制线条,参数一:线的起始位置和结束位置,参数2:颜色,参数3:线的宽度
            draw.line(lines, fill=self.random_color(64, 255), width=2)

    # 随机生成点
    def random_points(self, draw, rate):
        # 因为width为图形验证码的宽,height为图形验证码的高,整个图都是由点组成的
        # 点的x坐标范围:[0, 图形的宽度], y的坐标范围:[0, 图形的高度], 这样就能遍历图像的每一个像素点
        # rate 用来控制点生成的概率,大约100个点有rate个点被选中
        # point方法用来画点,参数1:点的坐标, 参数2:点的颜色
        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(64, 255))

    # 生成验证码图片
    def image_code(self):
        # 创建一个新图像 参数1:这个图像是RGB模式的,意味着它包含红色、绿色和蓝色三个颜色通道,
        # 参数2:图像的宽高
        # 参数3:图像的初始背景色
        image = Image.new('RGB', (self.width, self.height), (255, 255, 255))

        # ImageFont.truetype()加载字体函数,参数1:字体,去网上找一个字体即可,参数2:字体大小
        font = ImageFont.truetype(f'SourceHanSans-Bold.otf', self.size)

        # 画图
        draw = ImageDraw.Draw(image)

        # 在图上画线和点
        self.random_lines(draw)
        self.random_points(draw, 15)

        # 生成验证码
        code = self.random_str()

        # text函数用来绘制文本
        # 参数1:绘制文本的坐标
        # 参数2:文本,这里将4位字符的验证码拆开绘制
        # 参数3:字体
        # 参数4:颜色
        for i in range(self.length):
            draw.text((29 * i, 14), code[i], font=font, fill=self.random_color(32, 127))

        # 给图像滤镜
        image = image.filter(ImageFilter.DETAIL)

        # 保存图像到当前路径
        image.save(f'{code}.jpg')

        # 返回图像和验证码
        return image, code


if __name__ == '__main__':
    verify = ImageVerify()
    image, text = verify.image_code()
    print(image, text)



  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,生成随机图形验证码通常涉及到图像处理,如PIL(Python Imaging Library)或其更新版本Pillow,以及可能用到的随机数生成如random和numpy。以下是一个简单的步骤概述: 1. 导入所需的: ```python from PIL import Image, ImageDraw, ImageFont import random import numpy as np ``` 2. 定义图形元素,如线条、圆形、矩形、字母和数字: ```python def draw_random_shape(size, shapes): shape = random.choice(shapes) if shape == 'line': draw.line((random.randint(0, size), random.randint(0, size)), (random.randint(0, size), random.randint(0, size)), fill=(0, 0, 0)) elif shape == 'circle': center = (random.randint(0, size), random.randint(0, size)) draw.ellipse((center-10, center-10, center+10, center+10), fill=(0, 0, 0)) # 添加其他形状,如矩形等 def generate_text(): return ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=random.randint(4, 6))) ``` 3. 创建验证码图像: ```python size = 100 image = Image.new('RGB', (size, size), color='white') draw = ImageDraw.Draw(image) shapes = ['line', 'circle', 'rectangle'] # 可自定义形状列表 for _ in range(random.randint(4, 6)): draw_random_shape(size, shapes) text = generate_text() font = ImageFont.truetype("arial.ttf", size=random.randint(20, 30)) # 加载字体 text_position = (random.randint(10, size-10), random.randint(10, size-10)) draw.text(text_position, text, font=font, fill=(0, 0, 0)) # 保存验证码图片 image.save('captcha.png') ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值