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实现简单的socket server实例
Apr 29 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python使用selenium实现批量文件下载
Mar 11 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
python统计指定目录内文件的代码行数
Sep 19 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 Python
Python中基础数据类型 set集合知识点总结
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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
Python打印斐波拉契数列实例
2015/07/07 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
python实现八大排序算法(1)
2017/09/14 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
wxPython实现列表增删改查功能
2019/11/19 Python
py-charm延长试用期限实例
2019/12/22 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Opencv求取连通区域重心实例
2020/06/04 Python
8种常用的Python工具
2020/08/05 Python
Python ellipsis 的用法详解
2020/11/20 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
.NET程序员的几道面试题
2012/06/01 面试题
工业自动化专业自荐信范文
2014/04/10 职场文书
公司财务管理制度
2015/08/04 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书