使用python,生成数字在图片上的验证码

这篇具有很好参考价值的文章主要介绍了使用python,生成数字在图片上的验证码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用python,生成数字在图片上的验证码,python,python,开发语言
许多网站在注册时都要求输入验证码,这样做为了防止被程序恶意注册和保证网站安全

1. Pillow

PIL(Python Imaging Library)是一个强大的python图像处理库,只是支持到python2.7, Pillow虽说是PIL的一个分支,但是pillow支持python3.x,已经发展成比PIL本身更具活力的图像处理库,我们使用Pillow来生成验证码,安装方式为

pip install Pillow

2. 生成一张指定大小随机颜色的图片

2.1 随机颜色

颜色的处理使用(r,g,b)格式,r, g, b 的范围是[0, 255], 使用random模块的randint方法生成3个随机数

def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3

2.2 生成一张指定大小的图片

def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3

def generate_picture(width=120, height=35):
    image = Image.new('RGB', (width, height), random_color())
    return image

if __name__ == '__main__':
    image = generate_picture()
    image.save('test.png')

使用python,生成数字在图片上的验证码,python,python,开发语言

现在还只是生成了一张颜色随机的图片,接下来要在图片上面写上随机数字和字母

3. 在图片上写上随机数字和字母

3.1 生成随机数字和字母

def get_random_str():
    '''
    获取一个随机字符, 数字或小写字母
    :return:
    '''
    random_num = str(random.randint(0, 9))
    random_low_alpha = chr(random.randint(97, 122))
    random_char = random.choice([random_num, random_low_alpha])
    return random_char

使用random模块提供的随机函数生成指定长度的字符串

3.2 在image对象上画数字和字母

def draw_str(count, image, font_size):
    """
    在图片上写随机字符
    :param count: 字符数量
    :param image: 图片对象
    :param font_size: 字体大小
    :return:
    """
    draw = ImageDraw.Draw(image)
    # 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
    font_file = os.path.join('Andale Mono.ttf')
    font = ImageFont.truetype(font_file, size=font_size)
    temp = []
    for i in range(count):
        random_char = random_str()
        draw.text((10+i*30, -2), random_char, random_color(), font=font)
        temp.append(random_char)

    valid_str = "".join(temp)    # 验证码
    return valid_str, image

if __name__ == '__main__':
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image.save('test.png')

使用python,生成数字在图片上的验证码,python,python,开发语言

创建一个ImageDraw.Draw对象,在image上画随机字符,你可以设置字体, 我使用了Andale Mono.ttf, mac电脑上在/System/Library/Fonts 目录下找到字体,其他系统也有各自的字体文件,将字体文件复制到与脚本相同的目录下。

4. 制造噪点

为了防止验证码被轻易的破解,还应该在图片上制造一些噪点,随机画几条线,随机画几个点

def noise(image, width=120, height=35, line_count=3, point_count=20):
    '''

    :param image: 图片对象
    :param width: 图片宽度
    :param height: 图片高度
    :param line_count: 线条数量
    :param point_count: 点的数量
    :return:
    '''
    draw = ImageDraw.Draw(image)
    for i in range(line_count):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=random_color())

        # 画点
        for i in range(point_count):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())

    return image


if __name__ == '__main__':
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)
    image.save('test.png')

使用python,生成数字在图片上的验证码,python,python,开发语言

5. 生成base64编码的图片

实践中,如果是生成网站注册使用的验证码图片,一般来说不会将其保存到图片文件中,因为这会生成大量的小图片,完全没必要。我们可以将图片的内容保存到BytesIO对象中,最终生成base64编码的图片,这样,向前端传回去的就是字符串,格式为

data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAH...

data:image/jpeg;base64 这一段是固定写法,逗号剩余的部分是图片经过base64编码后的字符串

def valid_code():
    """
    生成图片验证码,并对图片进行base64编码
    :return:
    """
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)

    f = BytesIO()
    image.save(f, 'png')        # 保存到BytesIO对象中, 格式为png
    data = f.getvalue()
    f.close()

    encode_data = base64.b64encode(data)
    data = str(encode_data, encoding='utf-8')
    img_data = "data:image/jpeg;base64,{data}".format(data=data)
    return valid_str, img_data

if __name__ == '__main__':
    print(valid_code())

6. 全部代码

为了向你阐述生成验证码图片的过程,我将整个过程进行拆解,因此代码也被拆解的凌乱,你可以将这些代码整合,以便在实际应用中使用文章来源地址https://www.toymoban.com/news/detail-690593.html

import os
import random
import base64
from io import BytesIO
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont


def random_color():
    c1 = random.randint(0, 255)
    c2 = random.randint(0, 255)
    c3 = random.randint(0, 255)
    return c1, c2, c3


def generate_picture(width=120, height=35):
    image = Image.new('RGB', (width, height), random_color())
    return image


def random_str():
    '''
    获取一个随机字符, 数字或小写字母
    :return:
    '''
    random_num = str(random.randint(0, 9))
    random_low_alpha = chr(random.randint(97, 122))
    random_char = random.choice([random_num, random_low_alpha])
    return random_char

def draw_str(count, image, font_size):
    """
    在图片上写随机字符
    :param count: 字符数量
    :param image: 图片对象
    :param font_size: 字体大小
    :return:
    """
    draw = ImageDraw.Draw(image)
    # 获取一个font字体对象参数是ttf的字体文件的目录,以及字体的大小
    font_file = os.path.join('Andale Mono.ttf')
    font = ImageFont.truetype(font_file, size=font_size)
    temp = []
    for i in range(count):
        random_char = random_str()
        draw.text((10+i*30, -2), random_char, random_color(), font=font)
        temp.append(random_char)

    valid_str = "".join(temp)    # 验证码
    return valid_str, image


def noise(image, width=120, height=35, line_count=3, point_count=20):
    '''

    :param image: 图片对象
    :param width: 图片宽度
    :param height: 图片高度
    :param line_count: 线条数量
    :param point_count: 点的数量
    :return:
    '''
    draw = ImageDraw.Draw(image)
    for i in range(line_count):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=random_color())

        # 画点
        for i in range(point_count):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())

    return image


def valid_code():
    """
    生成图片验证码,并对图片进行base64编码
    :return:
    """
    image = generate_picture()
    valid_str, image = draw_str(4, image, 35)
    image = noise(image)

    f = BytesIO()
    image.save(f, 'png')        # 保存到BytesIO对象中, 格式为png
    data = f.getvalue()
    f.close()

    encode_data = base64.b64encode(data)
    data = str(encode_data, encoding='utf-8')
    img_data = "data:image/jpeg;base64,{data}".format(data=data)
    return valid_str, img_data

if __name__ == '__main__':
    print(valid_code())

到了这里,关于使用python,生成数字在图片上的验证码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python- 用GAN(Generative Adversarial Networks)实现,用于生成手写数字图片。

    用GAN(Generative Adversarial Networks)实现,用于生成手写数字图片。 导入 PyTorch 和相关的库,包括: torch : PyTorch 库。 torch.nn : PyTorch 中的神经网络模块。 torch.optim : PyTorch 中的优化器。 torch.nn.functional : PyTorch 中的函数式接口。 torch.utils.data : PyTorch 中的数据加载器。 torchvision :

    2024年02月03日
    浏览(53)
  • 使用python库解决登录的验证码识别-图片验证码

    前言: 在UI自动化测试和爬虫测试中,验证码是个比较头疼的问题,包括:图片验证码,滑块验证码,等一些常见的验证码场景。 识别验证码的python 库有很多,用起来也并不简单,这里推荐一个简单实用的识别验证码的库 ddddocr (带带弟弟ocr)库。 今天先用一个图片验证码示

    2023年04月11日
    浏览(42)
  • 利用PyTorch训练模型识别数字+英文图片验证码

    摘要:使用深度学习框架PyTorch来训练模型去识别4-6位数字+字母混合图片验证码(我们可以使用第三方库captcha生成这种图片验证码或者自己收集目标网站的图片验证码进行针对训练)。 一、制作训练数据集 我们可以把需要生成图片的一些参数放在setting.py文件中,方便以后更

    2024年04月15日
    浏览(45)
  • 前端生成图片验证码怎么做?

    ##题记:我们实现一个功能首先想一下我们需要做哪些工作,比如我们需要生成一个随机的图片验证码,我们需要一个就是点击事件获取验证码,通过接口我们去获取图片路径进行渲染就行,这里边还要牵扯一件事情就是获取一个随机数字,通过随机数字我们传给后端索取一

    2024年02月14日
    浏览(38)
  • java爬虫遇到网页验证码怎么办?(使用selenium模拟浏览器并用python脚本解析验证码图片)

            笔者这几天在爬取数据的时候遇到了一个很闹心的问题,就是在我爬取数据的时候遇到了验证码,而这个验证码又是动态生成的,尝试了很多方法都没能绕开这个验证码问题。         我的解决方案是:使用selenium模拟浏览器行为,获取到动态生成的验证码后用

    2024年02月09日
    浏览(112)
  • vue3+elementplus前端生成图片验证码

    1、安装 使用npm i identify --save 或者 yarn add identify --save 2、新建vue组件components/identify/identify.vue 3、一般是登录页面用到这个,在你的登录页面的from表单的相应位置加上填写验证码的html 4、在script下引入组件,并编写方法 5、效果  

    2024年01月20日
    浏览(50)
  • Python 使用 Stable Diffusion API 生成图片示例

    代码: 输出: 说明: 运行后,图片以及 JSON 将会输出到当前目录下 output 中; TIP: 当然前提是你已经部署好 Stable Diffusion API 服务; 并且安装好跟我一样的模型以及一些相关的 LoRA ;

    2024年02月16日
    浏览(77)
  • C语言求矩阵主副对角线上的数字和案例讲解

    思路分析 以四行四列的矩阵为例。  案例代码如下 代码运行结果如下  如果题意要求的是矩阵主副对角线上的数字之和,我们只需对上面的代码稍微修改即可。 代码如下 代码运行结果如下  

    2024年02月03日
    浏览(51)
  • 树莓派系统入门教程(三)—— 使用Windows上的VSCode远程连接树莓派进行Python开发

    很多开发者更喜欢在大屏幕和强大的开发环境中编写代码,但同时他们希望能在树莓派这样的微型计算机上执行和测试代码。VSCode提供了一个强大的远程开发工具,可以让你在Windows主机上编写代码,同时在树莓派上执行。下面将为你详细介绍如何实现: 1. 安装VSCode和SSH扩展

    2024年02月12日
    浏览(46)
  • FPGA上的时间数字转换器(TDC):详细概述及FPGA开发

    时间数字转换器(Time-to-Digital Converter,简称TDC)是一种用于测量或记录信号时间间隔的电子设备。在本文中,我们将详细概述基于FPGA的TDC,并提供相应的源代码示例,以帮助读者理解和实现这一功能。 一、TDC的工作原理 TDC的基本原理是测量信号的到达时间与参考时钟之间的

    2024年02月05日
    浏览(108)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包