直接上代码代码仅供学习交流,请勿用于非法用途
# -*- Coding:utf-8 -*-import randomimport osfrom PIL import Image, ImageDraw, ImageFont# 每个字母之间的间隙大小FontClearance = 2# 圆直径arcN = 0def getRandcolor(): ''' 获取随机rgb颜色元组 :return: ''' return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))def getRandstr(): ''' 获取随机字符0-9 a-z :return: ''' return random.choice([chr(random.randint(65, 90)), str(random.randint(0, 9))])def getRangBgimg(): ''' 从当前程序所在文件夹的imgs文件夹下获取一张随机的图片 :return: ''' currPath = os.getcwd() + "/imgs" fs = os.Listdir(currPath) return currPath + "/" + random.choice(fs)def getFontSize(n, wIDth, height): ''' 获取字体大小 :param n:字体个数 :param wIDth:图片宽度 :param height:图片高度 :return: ''' global arcN FontAllClearance = 2 * n * FontClearance reClearance = wIDth - FontAllClearance FontSize = reClearance // n startY = 0 if FontSize < height: startY = (height - FontSize) // 2 else: FontSize = height - 10 startY = 5 startX = FontClearance arcN = FontSize // 10 return FontSize, startX, startYdef getRandline(wIDth, height): ''' 获取随机线条 :param wIDth:图片宽度 :param height:图片高度 :return: ''' return random.randint(0, wIDth), random.randint(0, height), random.randint(0, wIDth), random.randint(0, height)def getRandPoint(wIDth, height): ''' 获取随机点的方形对角坐标 :param wIDth:图片宽度 :param height:图片高度 :return: ''' x = random.randint(0, wIDth) y = random.randint(0, height) return x, y, x + arcN, y + arcNdef genValIDCode(strNum, lineNums, pointNums): ''' 验证码生成函数 :param strNum:验证码字母数 :param lineNums:验证码线条数 :param pointNums:验证码圆圈数 :return: ''' # 获取一张随机图片的文件路径 imgPath = getRangBgimg() # 打开图片对象 img = Image.open(imgPath) # 获取图片的宽高 wIDth, height = img.size # 通过字体数目和图片的宽高,计算出字体大小,以及字体开始写入的x y 坐标 FontSize, startX, startY = getFontSize(strNum, wIDth, height) # 实例化一支画笔 draw1 = ImageDraw.Draw(img, mode="RGB") # 定义要使用的字体 Font1 = ImageFont.truetype("simfang.ttf", FontSize) # 写字 for i in range(strNum): s = getRandstr() draw1.text([startX + (i * FontSize) + (((2 * (i + 1)) - 1) * FontClearance), startY], s, getRandcolor(), Font=Font1) # 画线 for i in range(lineNums): draw1.line((getRandline(wIDth, height)), fill=getRandcolor()) # 画点 for i in range(pointNums): draw1.arc((getRandPoint(wIDth, height)), 0, 360, fill=getRandcolor()) # 生成图片 with open("pic.png", "wb") as f: img.save(f, format="png") print("生成成功!")if __name__ == '__main__': # 初始化验证码、线条数、圆圈数 strNum, lineNums, pointNums = 5, 5, 10 genValIDCode(strNum, lineNums, pointNums)
总结 以上是内存溢出为你收集整理的Python工具系列之验证码自动生成全部内容,希望文章能够帮你解决Python工具系列之验证码自动生成所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)