首页 > 其他分享 > 接单日记(四)验证码图片生成

接单日记(四)验证码图片生成

时间:2023-05-15 12:55:06浏览次数:28  
标签:font randint self 验证码 接单 size 日记 255

目录

接单日记(四)验证码图片生成

此为一个实验报告,故遵守实验报告的格式。

一、 实验目的

  1. 熟悉Python第三方库pillow的安装方法
  2. 熟悉Python第三方库pillow的简单使用
  3. 理解验证码图片的生成原理
  4. 理解Python内置模块string的函数方法,及其属性

二、 实验内容

编写程序,绘制一个验证码图片,要求图片的背景为白色,同时该验证码有随机四位字母或者数字组成,在图片上还需要有干扰线,可以不需要干扰点。

三、 程序及结果

1、 运行程序

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file: Verification.py
# @time: 2023/4/19 15:15
from random import choice, randint
from PIL import Image, ImageDraw, ImageFont


class Verification:
    """生成验证码图片的类"""

    def __init__(self, n, draw_line, size, font_path, bgcolor, path):
        self.draw_line = draw_line  # 是否添加干扰线
        self.n = n  # 生成即为验证码
        self.lis_all_code = []  # 存储获得的字母和数字
        self.getAllCode()  # 调用方法生成
        self.bgcolor = bgcolor  # 背景颜色
        # print(self.lis_all_code)  # 检测生成的字母和数字
        self.ret = ""  # 保存生成的验证码
        self.size = size  # 设置大小
        self.font = font_path  # 设置字体
        self.save_path = path  # 存储的路径

    def getAllCode(self):
        """获得所有字母和数字,存储在列表中"""
        for i in range(48, 58):
            self.lis_all_code.append(chr(i))
        for i in range(65, 91):
            self.lis_all_code.append(chr(i))
            self.lis_all_code.append(chr(i + 32))

    def add_line(self, pen):
        """添加干扰线,要传入画笔"""
        for i in range(randint(4, 8)):  # 随机生成四到八条干扰线
            # 颜色随机
            randColor = (randint(0, 255), randint(0, 255), randint(0, 255))
            # 起点随机
            start = (randint(0, self.size[0]), randint(0, self.size[1]))
            # 终点随机
            end = (randint(0, self.size[0]), randint(0, self.size[1]))
            # 画一条线
            pen.line([start, end], fill=randColor)

    def add_point(self, pen):
        """添加干扰点,传入画笔"""
        for i in range(randint(20, 24)):  # 生成随机个干扰点
            # 颜色随机
            randColor = (randint(0, 255), randint(0, 255), randint(0, 255))
            # 起点随机
            point = (randint(0, self.size[0]), randint(0, self.size[1]))
            pen.point(point, fill=randColor)

    def getImg(self):
        """获取验证码图片"""
        img = Image.new("RGBA", self.size, self.bgcolor)  # 创建一个图片
        pen = ImageDraw.Draw(img)  # 创建一个画笔
        font = ImageFont.truetype(self.font, 25)  # 实例化字体
        for i in range(self.n):  # 把文字写入图片中
            string = choice(self.lis_all_code)  # 生成随机的验证码
            self.ret += string  # 添加到结果中
            font_color = (randint(0, 255), randint(0, 255), randint(0, 255))  # 颜色随机
            # 验证码的初始横轴偏移量
            x_start = randint(2, 5)
            # 验证码的初始纵轴偏移量
            y_start = 0
            x = x_start + i * (self.size[0] // self.n)  # 获取每个字横坐标的位置
            y = randint(y_start, self.size[1] // 2) - 3  # 获取每个字纵坐标的位置
            pen.text([x, y], string, font=font, fill=font_color)  # 写入每一个字
        if self.draw_line:  # 如果要加干扰点线
            self.add_line(pen)
            self.add_point(pen)
        return img

    def main(self):
        """入口函数"""
        img = self.getImg()  # 获取图片
        img.save(self.save_path)  # 保存图片,因为里面有四色通道,所以要保存为png格式
        ret = self.ret
        self.ret = ""  # 重置 self.ret 的值
        return ret  # 同时要返回随机的字符串


if __name__ == "__main__":
    c = Verification(4, True, (100, 36), r'C:\Windows\Fonts\simfang.ttf', (255, 255, 255), "verify.png")
    print(c.main())

2、 运行结果

标签:font,randint,self,验证码,接单,size,日记,255
From: https://www.cnblogs.com/liuzhongkun/p/17401526.html

相关文章

  • 架构师日记-从数据库发展历程到数据结构设计探析
    作者:京东零售刘慧卿一数据库发展史起初,数据的管理方式是文件系统,数据存储在文件中,数据管理和维护都由程序员完成。后来发展出树形结构和网状结构的数据库,但都存在着难以扩展和维护的问题。直到七十年代,关系数据库理论的提出,以表格形式组织数据,数据之间存在关联关系,具有了良好......
  • 3月3日记录20230321
    计划[]学习mybatis[]maven,可以看完[]js[]改bug,让跑起来执行10点13分 学习maven15点52分 结束maven基础,开始看jdbc17点15分 还是改不掉错,继续学习mybatis和js知识记录maven学习基本概念第一个maven程序插件创建maven程序idea版创建maventomcat插件安装与web工程启动问题很......
  • 3月2日记录20230321
    计划[]学习JavaScript[]看crapapi代码[]全速进入开发阶段[]JDBC和mysql的知识补上午09点44分 学习javascript10点20分 ​​学会用typora画思维导图​​11点47分 开始学习编写JavaScript下午13点37分 继续学习JavaScript15点53分 了解mybatis16点08分 学习java英语角KobeB......
  • 3月13日记录20230321
    计划[x]学习CRM项目的数据库设计部[]阅读Java书籍[x]看crapapi代码,试图修改[]写形式与政策的论文[]把有mock功能的软件跑起来执行09点30分 一直在弄共享剪贴板10点18分 开始学习13点46分 开始工作16点18分 基本看数据表设计部分,还包含复习数据库知识,太恶心了16点57分 运行......
  • 3月10日记录20230321
    计划[]一定要把crapapi跑起来[]学习js[]学习java执行09点58分 开始工作11点16分 太恶心了,不行啊11点19分 再试一次13点39分 重新下载别的版本进行部署16点22分 ​​解决我的电脑里有百度网盘的问题​​16点30分 学习CRM项目的物理模型设计,即表结构设计知识记录跑起来了。。......
  • 3月9日记录20230321
    计划[]看crm视频,补充前面知识,加快开发进度[]阅读疯狂Java讲义[]有空英语[x]咸鱼收款[x]填写学校登记表执行09点35分 开始学习视频13点50分 抓紧时间,继续看16点05分 学习JavaScript,想实现首页注册登陆界面,可是代码看不懂,时间很紧张啊英语角ThesongsIoftenlistentoare......
  • 建民打卡日记5.14
    一、问题描述一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:Z:012345678910M:10X987......
  • 建民打卡日记5.12
    一、问题描述每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机......
  • 学习日记——CSS高级选择器
    1.层次选择器①后代选择器EF:选择匹配的F元素,且匹配的F元素被包含在匹配的E元素内②子选择器E>F:选择匹配的F元素,且匹配的F元素是匹配的E元素的子元素③相邻兄弟选择器E+F:选择匹配的F元素,且匹配的F元素紧位于匹配的E元素后面④通用兄弟选择器E~F:选择匹配的F元素,且位于匹配......
  • 【华为HCIP | 高级网络工程师】刷题日记(5)
    文章目录每日刷题30道1、已知路由器R1存在Loopback0且地址为1.1.1.1/32,在使能OSPF并引入直连路由时会把该环回口引入。那么以下哪一项的配置能够实现在引入直连路由时,Loopback0不会被引入,并能够保证其他直连路由引入到OSPF内?2、在MA网络中的两台DRother路由器R1和R2建立邻居关系,那......