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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python 多线程Threading初学教程
Aug 22 Python
python使用KNN算法手写体识别
Feb 01 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
python pygame模块编写飞机大战
Nov 20 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
python实现扫描ip地址的小程序
Apr 16 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 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
构建简单的Webmail系统
2006/10/09 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
python中input()与raw_input()的区别分析
2016/02/27 Python
3分钟学会一个Python小技巧
2018/11/23 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
Python根据成绩分析系统浅析
2019/02/11 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
python如何修改文件时间属性
2021/02/05 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
美国最大点评网站:Yelp
2018/02/14 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
视图的作用
2014/12/19 面试题
大学生旷课检讨书
2014/01/22 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
公司运动会策划方案
2014/05/25 职场文书
志愿者活动总结报告
2014/06/27 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
2015年教师节广播稿
2015/08/19 职场文书
中学音乐课教学反思
2016/02/18 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS