时间:2020-10-06来源:www.pcxitongcheng.com作者:电脑系统城
一、验证码图片的效果
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont width, height, font_size, font_num = 300 , 100 , 48 , 5 bg_color = (random.randint( 0 , 255 ), random.randint( 0 , 255 ), random.randint( 0 , 255 )) image = Image.new(mode = 'RGB' , size = (width, height), color = bg_color) draw = ImageDraw.Draw(image, mode = 'RGB' ) font = ImageFont.truetype( "C:\Windows\Fonts\Arial.ttf" , font_size) verify = str () for i in range (font_num): x = random.randint(i * (width / font_num), (i + 1 ) * (width / font_num) - font_size) y = random.randint( 0 , height - font_size) char = random.choice([ chr (alpha) for alpha in range ( 65 , 91 )] + [ str (num) for num in range ( 10 )]) verify + = char color = (random.randint( 0 , 255 ), random.randint( 0 , 255 ), random.randint( 0 , 255 )) draw.text((x, y), char, fill = color, font = font) print (verify) image.show() |
运行结果:
KG7CQ
二、使用的方法介绍
上面的代码已经实现了生成随机验证码的功能,现在介绍代码中用到的函数和方法。
Image.new(): Image模块中的new()函数,创建一张图片(画布),用于绘图。传入3个参数,画布的模式('RGB'表示真彩图片)、尺寸和颜色,画布的颜色就是验证码中的背景颜色。
ImageDraw.Draw(): ImageDraw模块中的Draw()函数,实例化一个ImageDraw类的对象draw,执行绘图。传入两个参数,画布和绘图的模式,画布使用前面Image.new()创建的画布,模式继续使用'RGB'真彩模式。Draw()函数会将传入的两个参数传给ImageDraw类,实例化一个类对象并返回,以便后面使用类对象draw调用对应的方法执行绘图,使用draw对象将验证码中的字符画在画布上。
ImageFont.truetype(): ImageFont模块中的truetype()函数,从字体文件或字体对象中读取字体并返回一个字体对象。传入两个参数,字体文件(或字体对象)和字体大小。字体只能使用当前电脑支持的字体,在Windows系统中,已安装的字体一般都保存在C:\Windows\Fonts文件夹中,如上面代码中的C:\Windows\Fonts\Arial.ttf,应该每个人都默认安装了,在代码中一定要带上扩展名'.ttf',否则读取不到字体文件。如果字体不在Windows\Fonts这个目录下,可以在控制面板找或直接在所有文件中搜索Fonts。字体大小传入一个数字即可。
random模块中的randint()和choice()。在上面的代码中,randint()用于随机生成颜色值,随机生成字符在画布上的x和y坐标。choice()用于从26个大写字母(chr字符集中65~90为26个大写字母)和数字中随机选择一个字符。
text(): ImageDraw模块的ImageDraw类的方法,使用ImageDraw.Draw()返回的类对象draw来调用,将字符画到画布上。text()方法有12个参数,并且还可以接收其他的可变参数和关键字参数,不过只有两个必传参数,上面的代码中也只传了4个参数,所以其他的参数就不做介绍了。第一个必传参数是xy,传入一个元组或列表,表示字符画到画布上的位置坐标(字符左上角),第二个必传参数是text,传入一个字符串,表示需要画的字符。上面还传了两个参数fill和font,fill表示字符的颜色,传入一个随机的颜色,font表示字符的字体,传入用ImageFont.truetype()函数返回的字体对象。
循环将每次随机生成的字符绘画到画布上,再使用image对象的show()方法将图片显示出来,随机的验证码图片就生成成功了。
三、优化封装
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import random from PIL import Image, ImageDraw, ImageFont def gen_verified_image(): width, height, font_size, font_num = 400 , 150 , 48 , 4 bg_color = (random.randint( 0 , 255 ), random.randint( 0 , 255 ), random.randint( 0 , 255 )) image = Image.new(mode = 'RGB' , size = (width, height), color = bg_color) draw = ImageDraw.Draw(image, mode = 'RGB' ) font = ImageFont.truetype( "C:\Windows\Fonts\Gadugi.ttf" , font_size) verify = str () for i in range (font_num): x = random.randint(i * (width / font_num) + 10 , (i + 1 ) * (width / font_num) - font_size - 10 ) y = random.randint( 20 , height - font_size - 20 ) char = random.choice([ chr (a) for a in range ( 65 , 91 )] + [ chr (b) for b in range ( 97 , 123 )] + [ str (num) for num in range ( 10 )]) verify + = char color = (random.randint( 0 , 255 ), random.randint( 0 , 255 ), random.randint( 0 , 255 )) draw.text((x, y), char, fill = color, font = font) return image, verify if __name__ = = '__main__' : image, verify = gen_verified_image() print (verify) image.show() |
运行结果:
qtC7
验证码的字体一般不会使用很容易辨认的字体,可以换一个复杂一点的。除了大写字母之外,也可以把小写字母加进来。调整字符的位置避免画到画布的边缘。将代码封装到一个函数中,并将image对象和验证码字符verify作为返回值,方便调用时展示图片和进行验证。
总结
到此这篇关于Python利用Pillow(PIL)库实现验证码图片的文章就介绍到这了,更多相关Python用Pillow(PIL)库验证码图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
2023-03-17
python flask项目打包成docker镜像发布的过程2023-03-17
python调试模块ipdb详解2023-03-17
python使用openai生成图像的超详细教程python cron定时任务触发接口自动化巡检 apscheduler报错:Run time of job …… next run at: ……)” was missed by misfire_grace_time参数 找到任务超时的根本原因...
2023-03-15