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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python脚本实现虾米网签到功能
Apr 12 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Python中__repr__和__str__区别详解
Nov 07 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
简单的Python人脸识别系统
Jul 14 Python
Python爬取12306车次信息代码详解
Aug 12 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
Python基础之字符串格式化详解
Apr 21 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中的Session及对Session有效期的控制
2016/01/08 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
永不消失的title提示代码
2007/02/15 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
pygame学习笔记(5):游戏精灵
2015/04/15 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
厨房工作人员岗位职责
2013/11/15 职场文书
销售简历自我评价
2014/01/24 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
科技工作者先进事迹
2014/08/16 职场文书
财务会计求职信范文
2015/03/20 职场文书
Python绘制分类图的方法
2021/04/20 Python
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
python3读取文件指定行的三种方法
2021/05/24 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL