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中的对象拷贝示例 python引用传递
Jan 23 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python中threading模块join函数用法实例分析
Jun 04 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP中Session的概念
2006/10/09 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
清除输入框内的空格
2016/12/21 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python调用摄像头显示图像的实例
2018/08/03 Python
Python中@property的理解和使用示例
2019/06/11 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
三星法国官方网站:Samsung法国
2019/10/31 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
python爬取某网站原图作为壁纸
2021/06/02 Python