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实现的下载8000首儿歌的代码分享
Nov 21 Python
详解Python中的各种函数的使用
May 24 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
Django基础知识与基本应用入门教程
Jul 20 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
YUV转为jpg图像的实现
Dec 09 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
使用Python发现隐藏的wifi
Mar 04 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 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+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
ini_set的用法介绍
2014/01/07 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
javascript 三种编解码方式
2010/02/01 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
DOM 事件的深入浅出(一)
2016/12/05 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
配置管理计划的主要内容有哪些
2014/06/20 面试题
大专生自我鉴定范文
2013/10/01 职场文书
汽车工程专业应届生求职信
2013/10/19 职场文书
十八届三中全会感言
2014/03/10 职场文书
学校标语大全
2014/06/19 职场文书
公司合作协议范文
2014/10/01 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript
Python加密与解密模块hashlib与hmac
2022/06/05 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server