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+PyQt5使用数据库窗口视图
Apr 24 Python
django DRF图片路径问题的解决方法
Sep 10 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
Python二维码生成识别实例详解
Jul 16 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Python实现简单的2048小游戏
Mar 01 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
php+mysql 实现身份验证代码
2010/03/24 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
document.getElementById介绍
2011/09/13 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
微信小程序页面开发注意事项整理
2017/05/18 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
详解vue-cli3使用
2018/08/14 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
对Django外键关系的描述
2019/07/26 Python
python输入错误后删除的方法
2019/10/12 Python
python opencv进行图像拼接
2020/03/27 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
学院领导推荐信
2013/10/30 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
职工运动会邀请函
2014/01/19 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
国庆节慰问信
2015/02/15 职场文书
出国留学英文自荐信
2015/03/25 职场文书