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 k-近邻算法实例分享
Jun 11 Python
编写简单的Python程序来判断文本的语种
Apr 07 Python
Python写入CSV文件的方法
Jul 08 Python
Python使用爬虫猜密码
Feb 19 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
基于Python脚本实现邮件报警功能
May 20 Python
Django windows使用Apache实现部署流程解析
Oct 12 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
python opencv实现图像配准与比较
Feb 09 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
输出控制类
2006/10/09 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
js 操作符汇总
2014/11/08 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
vue实现轮播图帧率播放
2021/01/26 Vue.js
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
深入理解python try异常处理机制
2016/06/01 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python进行特征提取的示例代码
2020/10/15 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
Java基础面试题
2014/07/19 面试题
大学生职业规划前言模板
2013/12/27 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
用Python爬取某乎手机APP数据
2021/06/15 Python
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
java基础——多线程
2021/07/03 Java/Android