python图片验证码生成代码


Posted in Python onJuly 02, 2016

本文实例为大家分享了python图片验证码实现代码,供大家参考,具体内容如下

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
 
try:
  import cStringIO as StringIO
except ImportError:
  import StringIO
 
_letter_cases = "abcdefghjkmnpqrstuvwxy"            # 小写字母
_upper_cases = "ABCDEFGHJKLMNPQRSTUVWXY"            # 大写字母
_numbers = "1234567890"                     # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))  # 生成允许的字符集合
default_font = "./DejaVuSans.ttf"                # 验证码字体
 
 
# 生成验证码接口
def generate_verify_image(size=(120, 30),
             chars=init_chars,
             img_type="GIF",
             mode="RGB",
             bg_color=(255, 255, 255),
             fg_color=(0, 0, 255),
             font_size=18,
             font_type=default_font,
             length=4,
             draw_lines=True,
             n_line=(1, 2),
             draw_points=True,
             point_chance=2,
             save_img=False):
 
  """
  生成验证码图片
  :param size: 图片的大小,格式(宽,高),默认为(120, 30)
  :param chars: 允许的字符集合,格式字符串
  :param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
  :param mode: 图片模式,默认为RGB
  :param bg_color: 背景颜色,默认为白色
  :param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
  :param font_size: 验证码字体大小
  :param font_type: 验证码字体,默认为 DejaVuSans.ttf
  :param length: 验证码字符个数
  :param draw_lines: 是否划干扰线
  :param n_line: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
  :param draw_points: 是否画干扰点
  :param point_chance: 干扰点出现的概率,大小范围[0, 100]
  :param save_img: 是否保存为图片
  :return: [0]: 验证码字节流, [1]: 验证码图片中的字符串
  """
 
  width, height = size # 宽, 高
  img = Image.new(mode, size, bg_color) # 创建图形
  draw = ImageDraw.Draw(img) # 创建画笔
 
  def get_chars():
    """生成给定长度的字符串,返回列表格式"""
 
    return random.sample(chars, length)
 
  def create_lines():
    """绘制干扰线"""
 
    line_num = random.randint(*n_line) # 干扰线条数
 
    for i in range(line_num):
      # 起始点
      begin = (random.randint(0, size[0]), random.randint(0, size[1]))
      # 结束点
      end = (random.randint(0, size[0]), random.randint(0, size[1]))
      draw.line([begin, end], fill=(0, 0, 0))
 
  def create_points():
    """绘制干扰点"""
 
    chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
 
    for w in xrange(width):
      for h in xrange(height):
        tmp = random.randint(0, 100)
        if tmp > 100 - 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) / 3),
         strs, font=font, fill=fg_color)
 
    return ''.join(c_chars)
 
  if draw_lines:
    create_lines()
  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) # 滤镜,边界加强(阈值更大)
 
  mstream = StringIO.StringIO()
  img.save(mstream, img_type)
 
  if save_img:
    img.save("validate.gif", img_type)
 
  return mstream, strs
 
 
if __name__ == "__main__":
  mstream, strs = generate_verify_image(save_img=True)
  print strs

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Django 限制访问频率的思路详解
Dec 24 Python
Python类反射机制使用实例解析
Dec 30 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
pandas apply多线程实现代码
Aug 17 Python
python 实现Harris角点检测算法
Dec 11 Python
python3读取文件指定行的三种方法
May 24 Python
Python可视化学习之matplotlib内置单颜色
Feb 24 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 #Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 #Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 #Python
Python编程中对super函数的正确理解和用法解析
Jul 02 #Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 #Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 #Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 #Python
You might like
PHP array操作10个小技巧分享
2011/06/23 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
Python实现程序的单一实例用法分析
2015/06/03 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
化验室技术员岗位职责
2013/12/24 职场文书
物流合作计划书
2014/01/10 职场文书
优乐美广告词
2014/03/14 职场文书
公司募捐倡议书
2014/05/14 职场文书
2015国庆节感想
2015/08/04 职场文书
心得体会格式及范文
2016/01/25 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python