lookfeiji 发表于 2023-11-15 14:10

生成验证码图片

看到别人训练模型验证码,我突然对于验证码的生成有点好奇了,于是搜索了一下找到一个源码。效果还不错,但是他生成的是字母与数字,于是我稍加修改将他改成了汉字。源码核心是取的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")


lookfeiji 发表于 2023-11-16 15:37

wodes 发表于 2023-11-16 13:44
OK,我自己研究研究。谢啦

我大概跟你说下思路你就知道了,先随机从Unicode码中的0x4E00到0x9FFF这个范围取值,将取出的转码为utf-8就是汉字了,再将四个汉字以字符串的形式加起来就是一个汉字字符串了,再新建一个画布将这个组字符串传递给画布就基本差不多了啊,一张带有汉字的图片不就出现了。其他的你要改变画布的背景色啊,字符串的字体大小与颜色啊,以及一些干扰元素什么的自己加就好了啊。

lookfeiji 发表于 2023-11-15 23:47

本帖最后由 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可能会报毒,文件名是验证码里的汉字

lookfeiji 发表于 2023-11-15 15:26

lilin123123 发表于 2023-11-15 15:23
有exe下载链接吗

不是批量生成的,生成一个你要的话晚上有时间给你搞一个

zhangxc1989 发表于 2023-11-15 15:44

楼主牛逼。。但这个验证如果不是按顺序点击,而是需要输入的话,我感觉很多人不一定认识这些字,哈哈哈

wuAiPJ52 发表于 2023-11-15 16:45

思路牛逼{:17_1073:},小建议:建立长度为N的常用字库表,然后取随机数%N

铅笔达人 发表于 2023-11-15 17:16

厉害,顶一下

nmn 发表于 2023-11-15 17:22

之前会做数字验证码,这又学习到了文字验证码的方法,多谢楼主!{:1_893:}

wodes 发表于 2023-11-15 17:23

lookfeiji 发表于 2023-11-15 15:26
不是批量生成的,生成一个你要的话晚上有时间给你搞一个

这个是用Python搞的嘛?能用JAVAweb搞一个吗?

ycz0030 发表于 2023-11-15 17:33

多谢分享,学习了

wangguang 发表于 2023-11-15 18:02

zhangxc1989 发表于 2023-11-15 15:44
楼主牛逼。。但这个验证如果不是按顺序点击,而是需要输入的话,我感觉很多人不一定认识这些字,哈哈哈

人不一定认识,但是人工智能绝对认识。如果人都不认识的话他这个验证码就是个绊脚的,防人不防,严重影响客户体验感

130366 发表于 2023-11-15 18:10

不认识这些字,换成常用字就好了。感谢分享
页: [1] 2 3
查看完整版本: 生成验证码图片