设为首页 收藏本站
查看: 770|回复: 0

[经验分享] python生成图片验证码

[复制链接]

尚未签到

发表于 2017-4-27 12:21:45 | 显示全部楼层 |阅读模式
  下面的代码是使用python生成图片验证码,然后结合flask,返回给前端显示。font_type指定字体路径,这里使用Mac原版字体Monaco.tar,运行程序,打开浏览器访问:localhost:18888/code/
  

#!/usr/bin/env python  
#coding=utf-8  
import random  
import Image, ImageDraw, ImageFont, ImageFilter  
import StringIO
from flask import Flask
#map:将str函数作用于后面序列的每一个元素
numbers = ''.join(map(str, range(10)))
chars = ''.join((numbers))  
def create_validate_code(size=(120, 30),  
chars=chars,  
mode="RGB",  
bg_color=(255, 255, 255),  
fg_color=(255, 0, 0),  
font_size=18,  
font_type="Monaco.ttf",  
length=4,  
draw_points=True,  
point_chance = 2):  
'''''
size: 图片的大小,格式(宽,高),默认为(120, 30)
chars: 允许的字符集合,格式字符串
mode: 图片模式,默认为RGB
bg_color: 背景颜色,默认为白色
fg_color: 前景色,验证码字符颜色
font_size: 验证码字体大小
font_type: 验证码字体,默认为 Monaco.ttf
length: 验证码字符个数
draw_points: 是否画干扰点
point_chance: 干扰点出现的概率,大小范围[0, 50]
'''
width, height = size  
img = Image.new(mode, size, bg_color) # 创建图形  
draw = ImageDraw.Draw(img) # 创建画笔  
def get_chars():  
'''''生成给定长度的字符串,返回列表格式'''
return random.sample(chars, length)  
def create_points():  
'''''绘制干扰点'''
chance = min(50, max(0, int(point_chance))) # 大小限制在[0, 50]  
for w in xrange(width):  
for h in xrange(height):  
tmp = random.randint(0, 50)  
if tmp > 50 - chance:  
draw.point((w, h), fill=(0, 0, 0))  
def create_strs():  
'''''绘制验证码字符'''
c_chars = get_chars()  
strs = '%s' % ''.join(c_chars)  
font = ImageFont.truetype(font_type, font_size)  
font_width, font_height = font.getsize(strs)  
draw.text(((width - font_width) / 3, (height - font_height) / 4),  
strs, font=font, fill=fg_color)  
return strs  
if draw_points:  
create_points()  
strs = create_strs()  
# 图形扭曲参数  
params = [1 - float(random.randint(1, 2)) / 100,  
0,  
0,  
0,  
1 - float(random.randint(1, 10)) / 100,  
float(random.randint(1, 2)) / 500,  
0.001,  
float(random.randint(1, 2)) / 500
]  
img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲  
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)  
return img,strs  
app = Flask(__name__)  
@app.route('/')  
def index():  
return 'test'
@app.route('/code/')  
def get_code():  
#把strs发给前端,或者在后台使用session保存  
code_img,strs = create_validate_code()  
buf = StringIO.StringIO()  
code_img.save(buf,'JPEG',quality=70)  
buf_str = buf.getvalue()  
response = app.make_response(buf_str)   
response.headers['Content-Type'] = 'image/jpeg'  
return response   
if __name__ == "__main__":  
app.run(host="localhost",port=18888,debug=True)

转载请注明来自:Alex
Zhou,本文链接:http://codingnow.cn/python/627.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370002-1-1.html 上篇帖子: Python模块filecmp 文件比较 下篇帖子: 名称日期python 获取日期
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表