python3 pillow模块实现简单验证码


Posted in Python onOctober 31, 2019

本文实例为大家分享了python3 pillow模块验证码的具体代码,供大家参考,具体内容如下

直接放代码吧,该写的注释基本都写了

# -*- coding: utf-8 -*-
# __author__: Pad0y

from PIL import Image, ImageDraw, ImageFont
from random import choice, randint, randrange
import string

# 候选字符集,大小写字母+数字
chrs = string.ascii_letters + string.digits


def selected_chrs(length):
  """
  返回length个随机字符串
  :param length:
  :return:
  """
  result = ''.join(choice(chrs) for _ in range(length))
  return result


def get_color():
  """
  设置随机颜色
  :return:
  """
  r = randint(0, 255)
  g = randint(0, 255)
  b = randint(0, 255)
  return (r, g, b)


def main(size=(200, 100), chrNumber=6, bgcolor=(255, 255, 255)):
  """
  定义图片大小,验证码长度,背景颜色
  :param size:
  :param chrNumber:
  :param bgcolor:
  :return:
  """
  # 创建空白图像和绘图对象
  image_tmp = Image.new('RGB', size, bgcolor)
  draw = ImageDraw.Draw(image_tmp)

  # 生成并计算随机字符的宽度和高度
  text = selected_chrs(chrNumber)
  font = ImageFont.truetype('c:\\windows\\fonts\\Roboto-Regular.ttf', 48) # 选定一款系统字体
  width, height = draw.textsize(text, font)
  if width + 2*chrNumber > size[0] or height > size[1]:
    print('Size Error!')
    return

  # 绘制字符串
  startX = 0
  width_eachchr = width // chrNumber # 计算每个字符宽度
  for i in range(chrNumber):
    startX += width_eachchr + 1
    position = (startX, (size[1]-height)//2+randint(-10, 10)) # 字符坐标, Y坐标上下浮动
    draw.text(xy=position, text=text[i], font=font, fill=get_color()) # 绘制函数

  # 对像素位置进行微调,实现验证码扭曲效果
  img_final = Image.new('RGB', size, bgcolor)
  pixels_final = img_final.load()
  pixels_tmp = image_tmp.load()
  for y in range(size[1]):
    offset = randint(-1, 0) # randint()相当于闭区间[x,y]
    for x in range(size[0]):
      newx = x + offset # 像素微调
      if newx >= size[0]:
        newx = size[0] - 1
      elif newx < 0:
        newx = 0
      pixels_final[newx, y] = pixels_tmp[x, y]

  # 绘制随机颜色随机位置的干扰像素
  draw = ImageDraw.Draw(img_final)
  for i in range(int(size[0]*size[1]*0.07)): # 7%密度的干扰像素
    draw.point((randrange(size[0]), randrange(size[1])), fill=get_color()) # randrange取值范围是左开右闭

  # 绘制随机干扰线,这里设置为8条
  for i in range(8):
    start = (0, randrange(size[1]))
    end = (size[0], randrange(size[1]))
    draw.line([start, end], fill=get_color(), width=1)

  # 绘制随机弧线
  for i in range(8):
    start = (-50, -50) # 起始位置在外边看起来才会像弧线
    end = (size[0]+10, randint(0, size[1]+10))
    draw.arc(start+end, 0, 360, fill=get_color())

  # 保存图片
  img_final.save('Veri_code.jpg')
  img_final.show()


if __name__ == '__main__':
  main((200, 100), 6, (255, 255, 255))

效果图如下

python3 pillow模块实现简单验证码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python的dict,set,list,tuple应用详解
Jul 24 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
Python中的单继承与多继承实例分析
May 10 Python
python八皇后问题的解决方法
Sep 27 Python
python实现多层感知器
Jan 18 Python
python3 求约数的实例
Dec 05 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
python中文分词库jieba使用方法详解
Feb 11 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
能让Python提速超40倍的神器Cython详解
Jun 24 Python
利用Python校准本地时间的方法教程
Oct 31 #Python
python实现计算器功能
Oct 31 #Python
python中的Elasticsearch操作汇总
Oct 30 #Python
django实现用户注册实例讲解
Oct 30 #Python
详解Django CAS 解决方案
Oct 30 #Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 #Python
Django实现CAS+OAuth2的方法示例
Oct 30 #Python
You might like
xml+php动态载入与分页
2006/10/09 PHP
深入PHP curl参数的详解
2013/06/17 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
轻松实现php文件上传功能
2017/02/17 PHP
PHP实现八皇后算法
2019/05/06 PHP
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
Python正则表达式知识汇总
2017/09/22 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
校园活动宣传方案
2014/03/28 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
打架检讨书
2015/01/27 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers