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字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
python进程管理工具supervisor使用实例
Sep 17 Python
Python 功能和特点(新手必学)
Dec 30 Python
python中map()与zip()操作方法
Feb 27 Python
python pycurl验证basic和digest认证的方法
May 02 Python
python让列表倒序输出的实例
Jun 25 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
pytorch中的inference使用实例
Feb 20 Python
详解Python修复遥感影像条带的两种方式
Feb 23 Python
Python扫描端口的实现
Jan 25 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
使用php实现截取指定长度
2013/08/06 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
密码强度检测效果实现原理与代码
2013/01/04 Javascript
用客户端js实现带省略号的分页
2013/04/27 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
python中的随机函数random的用法示例
2018/01/27 Python
使用python实现BLAST
2018/02/12 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Python连接Redis的基本配置方法
2018/09/13 Python
Python中最大递归深度值的探讨
2019/03/05 Python
Python实现爬取并分析电商评论
2020/06/19 Python
详解python中的闭包
2020/09/07 Python
Python类成员继承重写的实现
2020/09/16 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
会计工作心得体会
2014/01/13 职场文书
企业消防安全制度
2014/02/02 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
维稳工作情况汇报
2014/10/27 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers