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 相关文章推荐
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python卸载模块的方法汇总
Jun 07 Python
Python解惑之True和False详解
Apr 24 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python实现汽车管理系统
Nov 30 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
pandas的resample重采样的使用
Apr 24 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php的4种常见运行方式
2015/03/20 PHP
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
微信小程序实现留言板
2018/10/31 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
python发送邮件功能实现代码
2016/07/15 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
python写入文件自动换行问题的方法
2019/07/05 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
巴西购物网站:Onofre Agora
2020/06/08 全球购物
仓库主管岗位职责
2014/03/02 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
农村门前三包责任书
2014/07/25 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
初中美术教学反思
2016/02/17 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js