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 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
分享Python文本生成二维码实例
Jan 06 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Django重置migrations文件的方法步骤
May 01 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
python Pillow图像处理方法汇总
Oct 16 Python
关于Python-faker的函数效果一览
Nov 28 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
社团活动总结格式
2014/08/29 职场文书
优秀教师推荐材料
2014/12/16 职场文书
感动中国何玥观后感
2015/06/02 职场文书
数学备课组工作总结
2015/08/12 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript