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解析nginx日志文件
May 11 Python
Python中pygame安装方法图文详解
Nov 11 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
python 字典操作提取key,value的方法
Jun 26 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
分享PyCharm的几个使用技巧
Nov 10 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python如何写try语句
Jul 14 Python
python 使用建议与技巧分享(四)
Aug 18 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
Python访问Redis的详细操作
Jun 26 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(二)
2012/03/21 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
python梯度下降法的简单示例
2018/08/31 Python
Python装饰器简单用法实例小结
2018/12/03 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
优秀经理获奖感言
2014/03/04 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
小学科学课教学反思
2016/02/23 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python