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基于Tkinter的HelloWorld入门实例
Jun 17 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python3 log10()函数简单用法
Feb 19 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
关于python爬虫应用urllib库作用分析
Sep 04 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
Ajax PHP分页演示
2007/01/02 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
javascript数组快速打乱重排的方法
2014/01/02 Javascript
Javascript的&amp;&amp;和||的另类用法
2014/07/23 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python的文件操作方法汇总
2017/11/10 Python
Python装饰器用法实例总结
2018/02/07 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python3实现微型的web服务器
2019/09/03 Python
python 实现兔子生兔子示例
2019/11/21 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
Python日志器使用方法及原理解析
2020/09/27 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
普通院校学生的自荐信
2013/11/27 职场文书
思想汇报格式
2014/01/05 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android