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 相关文章推荐
Python中lambda的用法及其与def的区别解析
Jul 28 Python
Python实现基于HTTP文件传输实例
Nov 08 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
Tensorflow 多线程设置方式
Feb 06 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 和 XML: 使用expat函数(一)
2006/10/09 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP之预定义接口详解
2015/07/29 PHP
基于php编程规范(详解)
2017/08/17 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
python接入支付宝的实例操作
2020/07/20 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
2014年领导班子专项整治整改方案
2014/09/28 职场文书
民间个人借款协议书
2014/09/30 职场文书
劳动仲裁调解书
2015/05/20 职场文书
推广普通话的宣传语
2015/07/13 职场文书
预备党员入党感想
2015/08/10 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL