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中处理unchecked未捕获异常实例
Jan 17 Python
python并发2之使用asyncio处理并发
Dec 21 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
利用python修改json文件的value方法
Dec 31 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python取余运算符知识点详解
Jun 27 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
python中常用的数据结构介绍
Jan 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
PHP 字符串操作入门教程
2006/12/06 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP会话控制实例分析
2016/12/24 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
js里的prototype使用示例
2010/11/19 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
Python对象体系深入分析
2014/10/28 Python
python动态加载包的方法小结
2016/04/18 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
PHP笔试题
2012/02/22 面试题
架构师岗位职责
2013/11/18 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
python实现图片批量压缩
2021/04/24 Python
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
Python实现列表拼接和去重的三种方式
2021/07/02 Python
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技