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的迭代器与生成器实例详解
Jul 16 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
Python接口测试结果集实现封装比较
May 01 Python
Python远程方法调用实现过程解析
Jul 28 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
Python 远程开关机的方法
Nov 18 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 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不用正则采集速度探究总结
2008/03/24 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
在Python中使用正则表达式的方法
2015/08/13 Python
Python实现简单登录验证
2016/04/13 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python实现基于POS算法的区块链
2018/08/07 Python
详解小白之KMP算法及python实现
2019/04/04 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
syb养殖创业计划书
2014/01/09 职场文书
道德之星事迹材料
2014/05/03 职场文书
药品营销策划方案
2014/06/15 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
会计人员岗位职责
2015/02/03 职场文书