在web应用中,经常要是用到验证码,验证码可以简单就是用纯数字,或者是用字母等。
开始学习用python写web应用,遇到验证码的环节,这里采用一个png图片截取的方式,其实和使用字库也差不多。
用python操作图片,需要使用pil库,链接地址:pil官网
pil使用说明,官网有参考资料,这里记住字符图片使用png透明底色格式,和需要生成的图片使用RGBA模式就行。
code:
# -*- coding: utf-8 -*-
import Image,ImageDraw,ImageFont
import StringIO,sys,random
#code param is int 随机字符串
#imglen Verification code length 随机字符串长度
#path The current path 系统路径
#base The default string 字符串元组
#fongimg png格式的透明图片,上面弄好自定义的字符
#codeimg 需要生成字符的图片 大小为imglen长度乘以单个字符宽度
#按照fontimg上单个字符宽度随机截取字符,这里字符大小为(19,18)
path=sys.path[0]
imglen=4
base=('0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J',
'K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z')
def getcode():
code=''
fontimg=Image.open(path+"\\font\\font_t.png")
codeimg=Image.new('RGBA',(19*imglen,25))
#默认循环粘贴图片次数为imglen大小
for x in range(imglen):
ran=random.randint(0,35)
#添加随机生成的code在base元组中的字符
code=''.join((code,base[ran]))
#img_s 随机截取图片,并在(-45,45)度之间随机旋转,在粘贴上codeimg
img_s=fontimg.crop((ran*19,0,(ran+1)*19,20))
img_s=img_s.rotate(random.randint(-30,30))
codeimg.paste(img_s,(x*19,2))
#保存于字符流,打印给浏览器
out=StringIO.StringIO()
codeimg.save(out, "PNG")
return (code,out.getvalue())
随机生成图片效果: