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中xrange和range的区别
May 13 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
python 获取字符串MD5值方法
May 29 Python
python版本单链表实现代码
Sep 28 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
python实现简易学生信息管理系统
Apr 05 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
Pandas 缺失数据处理的实现
Nov 04 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python将音频进行变速的操作方法
Apr 08 Python
python实点云分割k-means(sklearn)详解
May 28 Python
PYTHON InceptionV3模型的复现详解
May 06 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把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
php+highchats生成动态统计图
2014/05/21 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
cakephp常见知识点汇总
2017/02/24 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
python实现批量转换图片为黑白
2020/06/16 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
员工加薪申请报告
2015/05/15 职场文书
Python安装使用Scrapy框架
2022/04/12 Python
Python开发五子棋小游戏
2022/05/02 Python