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文件操作之目录遍历实例分析
May 20 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
django中ImageField的使用详解
Dec 21 Python
python_tkinter弹出对话框创建
Mar 20 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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/09/02 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
javascript中this的四种用法
2015/05/11 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
js实现弹窗效果
2020/08/09 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
Python部署web开发程序的几种方法
2017/05/05 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
python实现动态数组的示例代码
2019/07/15 Python
使用python实现飞机大战游戏
2020/03/23 Python
什么是Python包的循环导入
2020/09/08 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
学校司机岗位职责
2013/11/14 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
节约用电标语
2014/06/17 职场文书
工资证明范本
2015/06/12 职场文书
超市主管竞聘书
2015/09/15 职场文书
车位出租协议书范本
2016/03/19 职场文书
物业管理交接协议书
2016/03/24 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP