下面我将为您详细介绍如何实现Python图片验证码。
简介
验证码是指利用计算机生成一些图形化的文字或数字,让用户识别之后,输入到指定位置,起到人机交互验证的作用。在现今的互联网应用中,验证码常用于注册、登录等场景,可以有效防范机器自动化操作。
在Python中,我们可以使用Pillow库来生成图片验证码。该库可以创建、操作和处理数百种不同的图片格式,我将在下面的攻略中使用该库来生成图片验证码。
步骤
步骤1: 安装Pillow库
Pillow库可以通过pip安装,只需要在命令行中输入以下命令即可:
pip install Pillow
步骤2: 生成验证码
下面是生成图片验证码的代码,可以将该代码保存为一个.py文件:
import random
from PIL import Image, ImageDraw, ImageFont
# 定义验证码大小
width, height = 200, 100
# 创建一个新的图片
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建ImageDraw对象
draw = ImageDraw.Draw(image)
# 定义验证码字体样式和大小
font = ImageFont.truetype('arial.ttf', 40)
# 定义验证码字符
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
# 生成随机字符
code = ''.join(random.sample(characters, 4))
# 在验证码图片中写入验证码字符
for i, char in enumerate(code):
x = width / 5 + (width * 3 / 5) / 4 * i
y = height / 3
draw.text((x, y), char, font=font, fill=(0, 0, 255))
# 添加干扰点
for _ in range(100):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
# 保存图片
image.save('code.jpg')
代码中有注释,一些主要的步骤包括:
- 创建一个新的白色图片;
- 使用ImageDraw对象,绘制验证码的样式和颜色;
- 生成随机字符,并在图片中写入这些字符;
- 在图片中添加干扰点,增加识别难度;
- 图片保存到本地。
步骤3: 测试
保存完代码后运行该代码,将会生成一个名为code.jpg的图片。浏览该图片,您将看到一个带有四个随机字符的图片。
示例一
下面是一个基于Flask框架的示例,实现了一个简单的验证码生成和显示功能。可以尝试在本地运行该代码,查看验证码图片效果。
import random
import io
from PIL import Image, ImageDraw, ImageFont
from flask import Flask, Response, request
app = Flask(__name__)
@app.route('/get_code')
def generate_code():
# 定义验证码大小
width, height = 200, 100
# 创建一个新的图片
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建ImageDraw对象
draw = ImageDraw.Draw(image)
# 定义验证码字体样式和大小
font = ImageFont.truetype('arial.ttf', 40)
# 定义验证码字符
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
# 生成随机字符
code = ''.join(random.sample(characters, 4))
# 在验证码图片中写入验证码字符
for i, char in enumerate(code):
x = width / 5 + (width * 3 / 5) / 4 * i
y = height / 3
draw.text((x, y), char, font=font, fill=(0, 0, 255))
# 添加干扰点
for _ in range(100):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
# 创建io对象,将验证码图片以字节流的形式输出
io_obj = io.BytesIO()
image.save(io_obj, 'JPEG')
io_obj.seek(0)
# 将验证码图片返回给前端
return Response(io_obj.getvalue(), mimetype='image/jpeg')
示例二
下面是一个Python脚本示例,该示例实现了生成多张图片验证码,并创建包含了每个验证码的CSV文件。csv文件中每一行代表一个验证码,第一列是验证码字符,第二列是该验证码等级(1、2或3,等级越高,验证码的难度越大)。可以尝试在本地运行该代码,查看生成的验证码图片和CSV文件。
import random
import csv
from PIL import Image, ImageDraw, ImageFont
# 定义生成验证码数量
num_codes = 10
# 定义验证码等级
level = [1, 2, 3]
# 定义验证码大小
width, height = 200, 100
# 创建CSV文件
with open('codes.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Code', 'Level'])
# 生成多个验证码,存储在csv文件中
for i in range(num_codes):
# 创建一个新的图片
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建ImageDraw对象
draw = ImageDraw.Draw(image)
# 定义验证码字体样式和大小
font = ImageFont.truetype('arial.ttf', random.randint(30, 50))
# 定义验证码字符
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
# 随机生成验证码字符和等级
code = ''.join(random.sample(characters, 4))
lv = random.choice(level)
# 在验证码图片中写入验证码字符
for i, char in enumerate(code):
x = width / 5 + (width * 3 / 5) / 4 * i
y = height / 3
draw.text((x, y), char, font=font, fill=(0, 0, 255))
# 添加干扰点
for _ in range(100):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
# 保存图片
filename = f'code_{i}.jpg'
image.save(filename)
# 将验证码信息存储在CSV文件中
writer.writerow([code, lv])
结论
以上就是利用Python生成图片验证码的完整攻略,通过本攻略、示例代码和说明,你应该已经掌握了如何利用Pillow库来实现图片验证码的生成。