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中用Descriptor实现类级属性(Property)详解
Sep 18 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
python如何获取apk的packagename和activity
Jan 10 Python
python numpy生成等差数列、等比数列的实例
Feb 25 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
Mar 19 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
如何利用Matlab制作一款真正的拼图小游戏
May 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
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python标准异常和异常处理详解
2015/02/02 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python实现将内容分行输出
2015/11/05 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python如何代码集体右移
2020/07/20 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
结婚典礼证婚词
2014/01/11 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
组织鉴定材料
2014/06/02 职场文书
谢师宴家长致辞
2015/07/27 职场文书
2016党校培训心得体会
2016/01/07 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript