【Python实现图片验证码】
"```python
import base64
import random
from PIL import Image
from PIL import ImageDraw # 画笔对象
from PIL import ImageFont # 字体对象
from io import BytesIO # 可将数据写到内存中
class AuthCode(object):
def __init__(self, digits=5, is_letter=False, image_size=(245, 40), font_path='kumo.ttf', font_size=36,
is_interfering_line=True,
interfering_line_count=1,
is_interfering_point=True,
interfering_point_count=10,
is_save_disk=False,
save_disk_path=None, # 保存到磁盘的路径,如果保存至磁盘,则必须save_disk_path
is_save_memory=True):
"""
内部功能全部通过传参调用
:param digits: 验证码长度
:param is_letter: 验证码是否包含字母
:param image_size: 图片大小 ("宽度", "高度")
:param font_path: 字体文件路径
:param font_size: 生成的字体大小
:param is_interfering_line: 是否给图片加干扰线
:param interfering_line_count: 干扰线数量
:param is_interfering_point: 是否给图片加干扰点
:param interfering_point_count: 干扰点数量
:param is_save_disk: 默认保存到磁盘
:param save_disk_path: 保存到磁盘的路径,如果保存至磁盘,则必须传入一个有效路径
:param is_save_memory: 是否保存到内存(以便传输)
"""
self.digits = digits
self.is_letter = is_letter
self.image_size = image_size
self.font_path = font_path
self.font_size = font_size
self.is_interfering_line = is_interfering_line
self.interfering_line_count = interfering_line_count
self.is_interfering_point = is_interfering_point
self.interfering_point_count = interfering_point_count
self.is_save_disk = is_save_disk
self.save_disk_path = save_disk_path
self.is_save_memory = is_save_memory
self.__code = self.__code_s() if self.is_letter else self.__code() # 获取验证码
img_obj, draw_obj = self.__image()
# 开始在图片上写验证码
[draw_obj.text((i * 56, 0), self.__code[i], self.__rgb_color(), self.__font()) for i in range(self.digits)]
# 是否增加干扰属性
self.is_interfering_line and self.__add_interfering_line(draw_obj)
self.is_interfering_point and self.__add_interfering_point(draw_obj)
# 将完工的图片保存
self.is_save_disk and self.__save_to_disk(img_obj)
self.is_save_memory and self.__save_to_memory(img_obj)
def get_code(self):
"""用于获取生成的验证码内容"""
return self.__code
def get_memory_img_data(self):
"""用于获取保存在内存中的图片"""
return base64.b64encode(self.__img_data)
def __save_to_disk(self, img_obj):
"""将图片保存到磁盘"""
with open(self.save_disk_path, 'wb') as f:
img_obj.save(f, format='png')
def __save_to_memory(self, img_obj):
"""保存至内存"""
f = BytesIO()
img_obj.save(f, format='png')
self.__img_data = f.getvalue()
def __code(self):
"""数字验证码"""
return [str(random.randint(0, 9)) for i in range(self.digits)]
def __code_s(self):
"""数字字母验证码"""
code = ''
for i in range(self.digits):
big_letter = chr(random.randint(65, 90)) # 大写字母
small_letter = chr(random.randint(97, 122)) # 小写字母
num = str(random.randint(0, 9))
code += random.choice([big_letter, small_letter, num])
return code
def __rgb_color(self):
"""随机返回RBG颜色类型的三个值"""
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def __image(self):
"""返回一个图片对象和这个图片对象的画笔对象"""
img_obj = Image.new('RGB', self.image_size, self.__rgb_color()) # 生成一个图片对象
# img_obj = Image.new("颜色类型", (图片宽度, 图片高度), (RGB的三个值))
draw_obj = ImageDraw.Draw(img_obj) # 在该图片对象上生成一个画笔对象
return img_obj, draw_obj
def __font(self):
"""返回一个字体对象, 需先下载字体"""
# return ImageFont.truetype("字体路径", "字体大小")
return ImageFont.truetype(self.font_path, self.font_size)
def __add_interfering_line(self, draw_obj):
"""加干扰线"""
width, height = self.image_size # 图片高宽(防止越界)
for i in range(self.interfering_line_count):
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw_obj.line((x1, y1, x2, y2), fill=self.__rgb_color())
def __add_interfering_point(self, draw_obj):
"""加干扰点"""
width, height = self.image_size # 图片高宽(防止越界)
for i in range(self.interfering_point_count):
draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=self.__rgb_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=self.__rgb_color())
if name == 'main':
# 生成验证码
obj = AuthCode(font_path='字体文件路径')
# 获取验证码内容
obj.get_code()
# 获取保存在内存中的验证码数据
obj.get_memory_img_data()
[Python下的PIL模块支持的字体文件下载](https://download.csdn.net/my/uploads)
下载后,指定文件路径即可.
"
【Python实现图片验证码】的更多相关文章
- python随机图片验证码的生成
Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Im ...
- python实现图片验证码
1 验证基础知识1.1 Python生成随机验证码,需要使用PIL模块. # 安装 pip3 install pillow 1.2 创建图片 from PIL import Image img = I ...
- 字符识别Python实现 图片验证码识别
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- python 识别图片验证码报IOError
说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...
- python添加图片验证码
1.创建验证码模块 #!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDra ...
- python爬虫20 | 小帅b教你如何使用python识别图片验证码
当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...
- Python实现图片验证码识别
转载地址:https://blog.csdn.net/EB_NUM/article/details/77060009 具体想要实现上面的代码需要安装两个包和一个引擎 在安装之前需要先安装好Python ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- 【python】带图片验证码的登录自动化实战
近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...
随机推荐
- VM中Linux网络设置(固定ip、连接外网开发环境)
在开发过程中,我们经常需要在linux中进行操作.毕竟服务器的系统大多数都是Linux,所以在dev环境需要配置好一台Linux系统配合开发. 在VMWare Workstation Pro中 ...
- Python读取Excel,日期列读出来是数字的处理
Python读取Excel,里面如果是日期,直接读出来是float类型,无法直接使用. 通过判断读取表格的数据类型ctype,进一步处理. 返回的单元格内容的类型有5种: ctype: 0 empty ...
- php 对接国外支付 ipay88支付
ipay88支付 近期接了一个国外的项目,客户指定要这种支付,就搞搞呗,其实流程和思路都是差不多的,往下看 他的流程其实非常简单 下面的流程仔细看看,看懂了就会了 1 首先我们需要先获取下单所需要的 ...
- 为什么 K8s 在阿里能成功(转)
为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进 作者:曾凡松 阿里云云原生应用平台高级技术专家张振 阿里云云原生应用平台高级技术专家 导读:本文描述了阿里巴巴在容器管理领域的技术演进历 ...
- 并查集路径分裂优化 UnionFind PathSpliting(C++)
/* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...
- oracle数据库操作 接口封装
1.如下 using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using Sy ...
- C++——绪论
计算机语言的发展 1.机器语言(二进制).汇编语言.比较难以理解和识记,与人类语言之间的差距太大: 2.高级语言,可以写出类似于人类思维的语句,可以有人们习惯的表达方式: 3.面向对象的语言,描述客观 ...
- 第一篇,VScode插架以及配置项
由于在开发的时候我们经常因为ESLint规范把自己搞的头晕眼花,修改起来又很浪费时间.所以我特别做个记录,如下代码可以轻松搞的. 工欲善其事必先利器,如果想要在开发的道路上如履平地必须要有得心 ...
- JS高级---逆推继承看原型
逆推继承看原型 function F1(age) { this.age = age; } function F2(age) { this.age = age; } F2.prototype = new ...
- Django_后台管理
1. 站点管理 2. 创建超级管理员 3. 添加自己的数据模型 默认是打印字符串的 4. 个性化站点管理的定制 4.1 个性化规则 admin.py 4.2 布尔值定制显示 4.3 插入班级的时候同时 ...