生成验证码图片
看到别人训练模型验证码,我突然对于验证码的生成有点好奇了,于是搜索了一下找到一个源码。效果还不错,但是他生成的是字母与数字,于是我稍加修改将他改成了汉字。源码核心是取的Unicode码中的0x4E00至0x9FFF中文取值范围,当然这个取值范围已经包含了中文大部分的汉字了。这个源码只是随机乱序,以及背景随机色,有兴趣的可以自行修改
其实仔细考虑一下感觉这里还有很多可以优化,可以整个跟随图片大小与排列方式的算法出来,以及多位汉字排序验证
import random
from PIL import Image, ImageDraw, ImageFont
def create_CAPTCHA_content():
"""
生成验证码内容的函数
:return:
"""
CAPTCHA_text = ""
for i in range(1, 5):# 4位验证码
CAPTCHA_text += chr(random.randint(0x4E00, 0x9FFF))# 随机取中文汉字的Unicode码chr转为汉字
return CAPTCHA_text
# 创建新图像
image = Image.new("RGB", (300, 100), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
draw = ImageDraw.Draw(image)# 创建画布
# 加载字体 是Windows自带的
font = ImageFont.truetype(r'C:\Windows\Fonts\simhei.ttf', size=30)
test = create_CAPTCHA_content()
for i in test:# 随机验证码
# 为每个验证码字符设置不同的RGB颜色
R = str(random.randint(0, 255))
G = str(random.randint(0, 255))
B = str(random.randint(0, 255))
draw.text((random.randint(50, 250), random.randint(15, 80)),# 摆放位置
text=i,
font=font,
fill="rgb(" + R + "," + G + "," + B + ")",
direction=None)
# 添加干扰线条
for i in range(1, random.randint(7, 15)):# 线条数量在7-15间
x, y = random.randint(0, 300), random.randint(0, 100)# 线条起点
x2, y2 = random.randint(0, 300), random.randint(0, 100)# 线条终点
# 随机颜色
R = str(random.randint(0, 255))
G = str(random.randint(0, 255))
B = str(random.randint(0, 255))
# 绘制线条 宽度为2
draw.line((x, y, x2, y2), fill="rgb(" + R + "," + G + "," + B + ")", width=2)
print(test)
image.show()
image.save("CAPTCHA.png")
wodes 发表于 2023-11-16 13:44
OK,我自己研究研究。谢啦
我大概跟你说下思路你就知道了,先随机从Unicode码中的0x4E00到0x9FFF这个范围取值,将取出的转码为utf-8就是汉字了,再将四个汉字以字符串的形式加起来就是一个汉字字符串了,再新建一个画布将这个组字符串传递给画布就基本差不多了啊,一张带有汉字的图片不就出现了。其他的你要改变画布的背景色啊,字符串的字体大小与颜色啊,以及一些干扰元素什么的自己加就好了啊。 本帖最后由 lookfeiji 于 2023-11-16 10:00 编辑
lookfeiji 发表于 2023-11-15 15:26
不是批量生成的,生成一个你要的话晚上有时间给你搞一个
百度网盘链接:https://pan.baidu.com/s/1Lg_prG5TnJglgpG_lOsbmw?pwd=52pj
提取码:52pj
用PyInstaller打包的360可能会报毒,文件名是验证码里的汉字
lilin123123 发表于 2023-11-15 15:23
有exe下载链接吗
不是批量生成的,生成一个你要的话晚上有时间给你搞一个 楼主牛逼。。但这个验证如果不是按顺序点击,而是需要输入的话,我感觉很多人不一定认识这些字,哈哈哈
思路牛逼{:17_1073:},小建议:建立长度为N的常用字库表,然后取随机数%N 厉害,顶一下 之前会做数字验证码,这又学习到了文字验证码的方法,多谢楼主!{:1_893:} lookfeiji 发表于 2023-11-15 15:26
不是批量生成的,生成一个你要的话晚上有时间给你搞一个
这个是用Python搞的嘛?能用JAVAweb搞一个吗? 多谢分享,学习了 zhangxc1989 发表于 2023-11-15 15:44
楼主牛逼。。但这个验证如果不是按顺序点击,而是需要输入的话,我感觉很多人不一定认识这些字,哈哈哈
人不一定认识,但是人工智能绝对认识。如果人都不认识的话他这个验证码就是个绊脚的,防人不防,严重影响客户体验感 不认识这些字,换成常用字就好了。感谢分享