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 相关文章推荐
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 Python
利用Python开发微信支付的注意事项
Aug 19 Python
python实现获取Ip归属地等信息
Aug 27 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
基于python实现银行管理系统
Apr 20 Python
Python time库的时间时钟处理
May 02 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
深入理解Python中各种方法的运作原理
2015/06/15 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
python自动下载图片的方法示例
2020/03/25 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
廉洁校园实施方案
2014/05/25 职场文书
教室布置标语
2014/06/26 职场文书
党员剖析材料范文
2014/09/30 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
HAM-2000摩机图
2021/04/22 无线电