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元组操作实例解析
Sep 23 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
python基础教程之分支、循环简单用法
Jun 16 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
Django框架封装外部函数示例
May 28 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python3压缩和解压缩实现代码
Mar 01 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php网站地图生成类示例
2014/01/13 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
跟老齐学Python之数据类型总结
2014/09/24 Python
详解Django通用视图中的函数包装
2015/07/21 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
教导处工作制度
2014/01/18 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
应届生求职信范文
2014/05/26 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
还款承诺书范本
2015/01/20 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
一文搞懂python异常处理、模块与包
2021/06/26 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript