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中optparse模块使用浅析
Jan 01 Python
python提取字典key列表的方法
Jul 11 Python
Python之re操作方法(详解)
Jun 14 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python-str,list,set间的转换实例
Jun 27 Python
Python最小二乘法矩阵
Jan 02 Python
Python字典循环添加一键多值的用法实例
Jan 20 Python
python线程的几种创建方式详解
Aug 29 Python
Python3视频转字符动画的实例代码
Aug 29 Python
python中图像通道分离与合并实例
Jan 17 Python
Python实现封装打包自己写的代码,被python import
Jul 12 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
JAVA/JSP学习系列之六
2006/10/09 PHP
PHP EOT定界符的使用详解
2008/09/30 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php实现的用户查询类实例
2015/06/18 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
php生成mysql的数据字典
2016/07/07 PHP
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
jQuery实现图片切换效果
2020/10/19 jQuery
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python 自动识别并连接串口的实现
2021/01/19 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
产品质量保证书
2014/04/29 职场文书
2014年生产部工作总结
2014/12/17 职场文书
爱心捐款感谢信
2015/01/20 职场文书
生死抉择观后感
2015/06/09 职场文书
自考生自我评价
2019/06/21 职场文书