接单日记(四)验证码图片生成
接单日记(四)验证码图片生成
此为一个实验报告,故遵守实验报告的格式。
一、 实验目的
- 熟悉Python第三方库pillow的安装方法
- 熟悉Python第三方库pillow的简单使用
- 理解验证码图片的生成原理
- 理解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、 运行结果
本文来自博客园,作者:Kenny_LZK,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/17401526.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2022-05-15 Python中typing模块
2022-05-15 Flask基础内容