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使用xauth方式登录饭否网然后发消息
Apr 11 Python
Windows和Linux下Python输出彩色文字的方法教程
May 02 Python
python使用tornado实现登录和登出
Jul 28 Python
python中类的属性和方法介绍
Nov 27 Python
Python lambda表达式用法实例分析
Dec 25 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
Python 硬币兑换问题
Jul 29 Python
解析python的局部变量和全局变量
Aug 15 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python如何在bool函数中取值
Sep 21 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
JS之小练习代码
2008/10/12 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
Python画图学习入门教程
2016/07/01 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python 12306抢火车票脚本
2018/02/07 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
美发店5.1活动方案
2014/01/24 职场文书
中学生期末评语
2014/02/03 职场文书
家具促销活动方案
2014/02/16 职场文书
大学生创业计划书
2014/08/14 职场文书
大学推普周活动总结
2015/05/07 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
MongoDB支持的索引类型
2022/04/11 MongoDB
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android