Python 模拟生成动态产生验证码图片的方法


Posted in Python onFebruary 01, 2020

模拟动态产生验证码图片

模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理。这里介绍一下 Python 提供的 Pillow 模块。

Pillow

PIL:Python Image Library,Python 的图像处理标准库,功能强大。

PIL 是第三方库,使用之前需要先进行安装。具体的命令如下:(如果安装了 Anaconda,这一步可以跳过)

$ pip install pillow

下面先简单介绍 Pillow 的功能。

操作图像

缩放图像,是 Pillow 的一个功能,示例如下:

from PIL import Image

# 打开图片,注意路径
img = Image.open('pitbull.jpeg')
# 获得图片尺寸
weight, height = img.size
print('原图片尺寸:{}x{}'.format(weight, height))

# 进行缩放,缩放 50%
img.thumbnail((weight//2, height//2))
print('调整后的图片尺寸:{}x{}'.format(weight//2, height//2))

# 将缩放后的图片保存
img.save('thumbnail.jpg', 'jpeg')

Pillow 还有其他的功能,例如旋转,剪切,滤镜,输出文字,调色板等。

ImageFilter

下面尝试模糊图片处理:

from PIL import Image,ImageFilter

# 打开图片文件,注意路径

img = Image.open('pitbull.jpeg')

# 应用模糊滤镜
img2 = img.filter(ImageFilter.BLUR)

img2.save('blur.jpg', 'jpeg')

ImageFilter 是 Python 提供的图像滤波,而 ImageFilter.BLUR 是模糊滤波。

上面代码具体的效果如下:

Python 模拟生成动态产生验证码图片的方法

Python 模拟生成动态产生验证码图片的方法

ImageDraw

同时 Pillow 的 ImageDraw 提供了一些列绘图方法,使我们可以直接绘图。下面使用这种方法来尝试生成字母验证码图片:

# -*- coding: utf-8 -*-
'''
@File: generate_random_code.py
@Time: 2020/01/31 20:32:10
@Author: 大梦三千秋
@Contact: yiluolion@126.com
'''

# Put the import lib here
from random import randint, choice
from PIL import Image, ImageDraw, ImageFont, ImageFilter


def rnd_chr(chr_set):
  '''获取随机字符

  Args:
    chr_set: 拟定生成的字符集

  Returns:
    返回随机字符
  '''
  return choice(chr_set)


def rnd_bg_color():
  '''获取随机像素值,填充背景

  Returns:
    返回随机像素值,返回元组类型
  '''
  return (randint(97, 255), randint(97, 255), randint(97, 255))


def rnd_chr_color():
  '''获取随机像素,填充输出字符

  Returns:
    返回随机像素值,返回元组类型
  '''
  # 与画板填充色进行一定的错开,防止完全覆盖
  return (randint(32, 96), randint(32, 96), randint(32, 96))


def main():
  # 生成字符集
  chr_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  for i in range(65, 91):
    chr_set.append(chr(i))
  for j in range(97, 123):
    chr_set.append(chr(j))
  # print(chr_set)

  # 定义画板规格 250 x 50
  width = 60 * 5
  height = 60

  # 创建 Image 对象,白底画板
  image = Image.new('RGB', (width, height), (255, 255, 255))
  # 创建 Draw 对象
  draw = ImageDraw.Draw(image)
  # 创建 Font 对象
  font = ImageFont.truetype('./consola.ttf', 36)

  # 填充画板
  for x in range(width):
    for y in range(height):
      draw.point((x, y), fill=rnd_bg_color())

  # 填充文字
  for n in range(5):
    draw.text((60 * n + 25, 12), rnd_chr(chr_set), fill=rnd_chr_color(), font=font)
  
  # 对图像内容进行模糊后存储
  image = image.filter(ImageFilter.BLUR)
  image.save('./random_code.jpg', 'jpeg')

if __name__ == "__main__":
  main()

代码具体实现过程是,先用随机颜色填充背景,再生成字母,最后对图片进行模糊处理。具体实现效果如下:

Python 模拟生成动态产生验证码图片的方法

代码在运行的过程中,可能会出现下面的错误:

IOError: cannot open resourse

出现这个问题的原因是 PIL 无法定位到字体文件的位置,可以考虑直接提供绝对位置。

font = ImageFont.truetype('/absolute/path/font.ttf', 36)

本篇文章提及的 Pillow 仅是简单的部分功能,如果要继续了解 PIL 的强大功能,可以参考 Pillow 官方文档:

https://pillow.readthedocs.org/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python2.7 json 转换日期的处理的示例
Mar 07 Python
将python代码和注释分离的方法
Apr 21 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
tensorflow实现逻辑回归模型
Sep 08 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
python简单利用字典破解zip文件口令
Sep 07 Python
python从PDF中提取数据的示例
Oct 30 Python
利用Python+OpenCV三步去除水印
May 28 Python
Python递归及尾递归优化操作实例分析
Feb 01 #Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 #Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 #Python
Python random模块制作简易的四位数验证码
Feb 01 #Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 #Python
Python warning警告出现的原因及忽略方法
Jan 31 #Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 #Python
You might like
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
python中web框架的自定义创建
2019/09/08 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
基于Python实现天天酷跑功能
2021/01/06 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
关于打架的检讨书
2014/01/17 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
企业承诺书怎么写
2014/05/24 职场文书
新课培训心得体会
2014/09/03 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
创业计划书之网吧
2019/10/10 职场文书