视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python如何制作图片验证码的简单实例
2020-11-27 14:14:47 责编:小采
文档
 本篇文章主要介绍了Python简单的制作图片验证码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这里示范的验证码都是简单的,你也可以把字符扭曲


Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码

PIL安装

命令安装:

pip install pillow

例子:生成图片,并填充文字

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 
输出文字: str1 = "ren ren Python" w = 4 #距离图片左边距离 h = 10 #距离图片上边距离 draw.text((w, h), str1, font=font) # 模糊: image.filter(ImageFilter.BLUR) code_name = 'test_code_img.jpg' save_dir = './{}'.format(code_name) image.save(save_dir, 'jpeg') print("已保存图片: {}".format(save_dir))
(venv) allenwoo@~/renren/code$ python test2.py 
已保存图片: ./test_code_img.jpg

图片如下:

文字没有什么色彩,我们也可以加上颜色,只需要在 text 中传人 fill 参数就好

draw.text((w, h), str1, font=font, fill = (78, , 65))

随便加的颜色


我们还可以把背景弄成很多个小点,每隔n隔像素填充个其他颜色比如:

#!/usr/bin/python
#-*-coding:utf-8-*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 实例一个图片对象240 x 60:
width = 60 * 4
height = 60
# 图片颜色
clo = (43, 34, 88) # 我觉得是紫蓝色
image = Image.new('RGB', (width, height), clo)

# 创建Font对象:
# 字体文件可以使用操作系统的,也可以网上下载
font = ImageFont.truetype('./font/Arial.ttf', 36)

# 创建Draw对象:
draw = ImageDraw.Draw(image)

# 填充像素:
# 宽每隔 20, 高每隔5, 形成坐标x,y
# 红色:220,20,60
for x in range(0, width, 20):
 for y in range(0, height, 5):
 draw.point((x, y), fill=(220, 20, 60))

# 
输出文字: str1 = "we are renren" w = 4 #距离图片左边距离 h = 10 #距离图片上边距离 draw.text((w, h), str1, font=font, fill = (78, , 65)) # 模糊: image.filter(ImageFilter.BLUR) code_name = 'test_code_img.jpg' save_dir = './{}'.format(code_name) image.save(save_dir, 'jpeg') print("已保存图片: {}".format(save_dir))

结果图片:


PIL制作验证码

利用以上这些,还有我们之前学习的随机生成器random就可以做个验证码了,

生成验证码代码

#!/usr/bin/python
#-*-coding:utf-8-*-
from uuid import uuid1
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
def rnd_char():
 '''
 随机一个字母或者数字
 :return: 
 '''
 # 随机一个字母或者数字
 i = random.randint(1,3)
 if i == 1:
 # 随机个数字的十进制ASCII码
 an = random.randint(97, 122)
 elif i == 2:
 # 随机个小写字母的十进制ASCII码
 an = random.randint(65, 90)
 else:
 # 随机个大写字母的十进制ASCII码
 an = random.randint(48, 57)
 # 根据Ascii码转成字符,return回去
 return chr(an)

# 干扰
def rnd_dis():
 '''
 随机一个干扰字
 :return: 
 '''
 d = ['^','-', '~', '_', '.']
 i = random.randint(0, len(d)-1)
 return d[i]

# 两个随机颜色都规定不同的区域,防止干扰字符和验证码字符颜色一样
# 随机颜色1:
def rnd_color():
 '''
 随机颜色,规定一定范围
 :return: 
 '''
 return (random.randint(, 255), random.randint(, 255), random.randint(, 255))

# 随机颜色2:
def rnd_color2():
 '''
 随机颜色,规定一定范围
 :return: 
 '''
 return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

def create_code():
 # 240 x 60:
 width = 60 * 4
 height = 60
 image = Image.new('RGB', (width, height), (192, 192, 192))
 # 创建Font对象:
 font = ImageFont.truetype('./font/Arial.ttf', 36)

 # 创建Draw对象:
 draw = ImageDraw.Draw(image)

 # 填充每个像素:
 for x in range(0, width, 20):
 for y in range(0, height, 10):
 draw.point((x, y), fill=rnd_color())

 # 填充字符
 _str = ""
 # 填入4个随机的数字或字母作为验证码
 for t in range(4):
 c = rnd_char()
 _str = "{}{}".format(_str, c)

 # 随机距离图片上边高度,但至少距离30像素
 h = random.randint(1, height-30)
 # 宽度的化,每个字符占图片宽度1/4,在加上10个像素空隙
 w = width/4 * t + 10
 draw.text((w, h), c, font=font, fill=rnd_color2())

 # 实际项目中,会将验证码 保存在数据库,并加上时间字段
 print("保存验证码 {} 到数据库".format(_str))

 # 给图片加上字符干扰,密集度由 w, h控制
 for j in range(0, width, 30):
 dis = rnd_dis()
 w = t * 15 + j

 # 随机距离图片上边高度,但至少距离30像素
 h = random.randint(1, height - 30)
 draw.text((w, h), dis, font=font, fill=rndColor())

 # 模糊:

 image.filter(ImageFilter.BLUR)

 # uuid1 生成唯一的字符串作为验证码图片名称
 code_name = '{}.jpg'.format(uuid1())
 save_dir = './{}'.format(code_name)
 image.save(save_dir, 'jpeg')
 print("已保存图片: {}".format(save_dir))

# 当直接运行文件的是和,运行下面代码
if name == "main":
 create_code()
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 ef3k 到数据库
已保存图片: ./c86e03c0-1c23-11e7-999d-f45cc09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 I37X 到数据库
已保存图片: ./cb8aed02-1c23-11e7-9b18-f45cc09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 vVL1 到数据库
已保存图片: ./cc120da8-1c23-11e7-b762-f45cc09e61.jpg
(venv) allenwoo@~/renren/code$ python test.py 
保存验证码 K6w3 到数据库
已保存图片: ./cc1e05-1c23-11e7-b7ec-f45cc09e61.jpg




你觉得难不难呢?最后这个生成验证码代码中有些逻辑问题要理解下

下载本文
显示全文
专题