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中的条件判断语句与循环语句用法小结
Mar 21 Python
python Django批量导入不重复数据
Mar 25 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
python如何通过实例方法名字调用方法
Mar 21 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
python str字符串转uuid实例
Mar 03 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
Django自关联实现多级联动查询实例
May 19 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 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
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
JavaScript Split()方法
2015/12/18 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
python numpy 按行归一化的实例
2019/01/21 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
C语言面试题
2015/10/30 面试题
六年级数学教学反思
2014/02/03 职场文书
化妆品店促销方案
2014/02/24 职场文书
学生会部长竞聘书
2014/03/31 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
保护环境建议书300字
2014/05/13 职场文书
七年级地理教学计划
2015/01/22 职场文书
求职自我评价怎么写
2015/03/09 职场文书
健康教育主题班会
2015/08/14 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL