最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

接单日记(四)验证码图片生成|全球今头条

来源:博客园


(资料图片仅供参考)

目录
  • 接单日记(四)验证码图片生成
    • 一、 实验目的
    • 二、 实验内容
    • 三、 程序及结果
      • 1、 运行程序
      • 2、 运行结果

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

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

一、 实验目的

  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:15from random import choice, randintfrom PIL import Image, ImageDraw, ImageFontclass 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、 运行结果

关键词: