tornado 之 图片验证码

生成图片的验证码,进行图像处理,需使用Pillow

  1 #!/usr/bin/env python
  2 #coding:utf-8
  3
  4 import os
  5 import random
  6 from PIL import Image, ImageDraw, ImageFont, ImageFilter
  7
  8 _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
  9 _upper_cases = _letter_cases.upper()  # 大写字母
 10 _numbers = ‘‘.join(map(str, range(3, 10)))  # 数字
 11 init_chars = ‘‘.join((_letter_cases, _upper_cases, _numbers))
 12
 13 def create_validate_code(size=(120, 30),
 14                          chars=init_chars,
 15                          img_type="GIF",
 16                          mode="RGB",
 17                          bg_color=(255, 255, 255),
 18                          fg_color=(0, 0, 255),
 19                          font_size=18,
 20                          font_type=os.path.join(os.path.dirname(__file__),"Monaco.ttf"),
 21                          length=4,
 22                          draw_lines=True,
 23                          n_line=(1, 2),
 24                          draw_points=True,
 25                          point_chance = 2):
 26     # font_type =os.path.join(os.path.dirname(__file__), font_type)
 27     ‘‘‘
 28     @todo: 生成验证码图片
 29     @param size: 图片的大小,格式(宽,高),默认为(120, 30)
 30     @param chars: 允许的字符集合,格式字符串
 31     @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
 32     @param mode: 图片模式,默认为RGB
 33     @param bg_color: 背景颜色,默认为白色
 34     @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
 35     @param font_size: 验证码字体大小
 36     @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
 37     @param length: 验证码字符个数
 38     @param draw_lines: 是否划干扰线
 39     @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
 40     @param draw_points: 是否画干扰点
 41     @param point_chance: 干扰点出现的概率,大小范围[0, 100]
 42     @return: [0]: PIL Image实例
 43     @return: [1]: 验证码图片中的字符串
 44     ‘‘‘
 45
 46     width, height = size # 宽, 高
 47     img = Image.new(mode, size, bg_color) # 创建图形
 48     draw = ImageDraw.Draw(img) # 创建画笔
 49
 50     def get_chars():
 51         ‘‘‘生成给定长度的字符串,返回列表格式‘‘‘
 52         return random.sample(chars, length)
 53
 54     def create_lines():
 55         ‘‘‘绘制干扰线‘‘‘
 56         line_num = random.randint(*n_line) # 干扰线条数
 57
 58         for i in range(line_num):
 59             # 起始点
 60             begin = (random.randint(0, size[0]), random.randint(0, size[1]))
 61             #结束点
 62             end = (random.randint(0, size[0]), random.randint(0, size[1]))
 63             draw.line([begin, end], fill=(0, 0, 0))
 64
 65     def create_points():
 66         ‘‘‘绘制干扰点‘‘‘
 67         chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
 68
 69         for w in range(width):
 70             for h in range(height):
 71                 tmp = random.randint(0, 100)
 72                 if tmp > 100 - chance:
 73                     draw.point((w, h), fill=(0, 0, 0))
 74
 75     def create_strs():
 76         ‘‘‘绘制验证码字符‘‘‘
 77         c_chars = get_chars()
 78         strs = ‘ %s ‘ % ‘ ‘.join(c_chars) # 每个字符前后以空格隔开
 79
 80         font = ImageFont.truetype(font_type, font_size)
 81         font_width, font_height = font.getsize(strs)
 82
 83         draw.text(((width - font_width) / 3, (height - font_height) / 3),
 84                     strs, font=font, fill=fg_color)
 85
 86         return ‘‘.join(c_chars)
 87
 88     if draw_lines:
 89         create_lines()
 90     if draw_points:
 91         create_points()
 92     strs = create_strs()
 93
 94     # 图形扭曲参数
 95     params = [1 - float(random.randint(1, 2)) / 100,
 96               0,
 97               0,
 98               0,
 99               1 - float(random.randint(1, 10)) / 100,
100               float(random.randint(1, 2)) / 500,
101               0.001,
102               float(random.randint(1, 2)) / 500
103               ]
104     img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
105
106     img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
107
108     return img, strs

help/check_code.py

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>用户登录</title>
 6 </head>
 7 <body>
 8 <p><input type="text" name="username" placeholder="用户名"></p>
 9 <p><input type="password" name="password" placeholder="密码"></p>
10 <p>
11     <input type="text" name="chkcode" placeholder="验证码">
12     <img src="/check_code" style="cursor: pointer" onclick="this.setAttribute(‘src‘,‘/check_code?nocache=‘+Math.random());">
13 </p>
14 </body>
15 </html>

views/login.html

 1 class CheckCodeHandler(BaseHandler):
 2     def get(self, *args, **kwargs):
 3         import io
 4         from TornadoTest3.helper import check_code
 5         mstream = io.BytesIO()
 6         # 创建图片,并写入验证码
 7         img, code = check_code.create_validate_code()
 8         # 将图片对象写入到内存
 9         img.save(mstream, "GIF")
10         self.write(mstream.getvalue())
时间: 2024-08-14 08:45:01

tornado 之 图片验证码的相关文章

第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证

Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片  生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处理模块里的PIL(图像库),为第三方模块,需要安装 封装验证码图片生成插件py 在封装文件里先导入random(随机模块),和Pillow()图像处理模块里的所需py文件 封装验证码图片生成插件功能,调用后返回验证码图片,和字符串类型验证码,两个返回值 注意:验证码需要一个字体文件,这个字体文件必须

django图片验证码和滑动验证

1. django-simple-captcha 模块 安装 django-simple-captcha pip install django-simple-captcha pip install Pillow 注册 和注册 app 一样,captcha 也需要注册到 settings 中.同时它也会创建自己的数据表,因此还需要数据同步. # settings.py INSTALLED_APPS = [ ... 'captcha', ] # 执行命令进行数据迁徙,会发现数据库中多了一个 capt

水印、图片验证码

(貌似这个验证码不能获取,假设设置一个隐藏的label来记录又失去了他的意义) 一.水印 1.画布 System.Drawing.Image img = System.Drawing.Image.FromStream(FileUpload1.FileContent); 2.创建绘制对象,告诉它往哪张图片上绘制 Graphics g = Graphics.FromImage(img); 3.绘制的内容 string s = "www.itnba.com"; 4.绘制的字体 Font f

水印,图片验证码

加水印: 1.画布 2.笔.颜色.从那开始画.画的内容 获取新的路径 保存新的图片 设置新图片为背景 图片验证码: 例如画一个abcd 100*5o大小.黑体30像素.红色的 为了防止被抓去,跳转到另一个页面执行,需要把照片用流输出回去 完整验证码 验证:

图片验证码

1.首先创建一个web窗体,只使用后台部分,生成验证码,并输出图片流跟图片验证码的字符,在使用验证码的窗体中图片控件直接指向这个窗体 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; public partial class Y

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

基于spring mvc的图片验证码实现

基于spring mvc的图片验证码实现 标签: springmvcspring mvc验证码验证码验证 2016-01-28 10:49 8015人阅读 评论(4) 收藏 举报  分类: 表单处理 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文实现基于spring mvc的图片验证码,分后台代码和前端页面的展现以及验证码的验证. 首看后台实现代码: @RequestMapping({"authCode"}) public void getAuthCode(HttpServ

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

【问题】做图片验证码时乱码了,在header前加上ob_clean()就能神奇的显示?!

源代码如下: 1 <?php 2 //图片验证码 3 // 该方法必须处于脚本最顶部 4 session_start(); 5 // 验证码图片和对应的验证值的对应关系 6 $table = array( 7 'pic0' => '博美', 8 'pic1' => '仓鼠', 9 'pic2' => '萨摩', 10 'pic3' => '泰迪', 11 ); 12 13 $index = rand(0,3); 14 15 $value = $table['pic'.$ind