生成图形验证码是一个较为常见的需求,Python提供了丰富的模块支持我们生成图形验证码。
下面我将详细讲解如何使用Python生成图形验证码。
1. 安装 Pillow 模块
Pillow是一个图形处理库,它支持Python 3.x。使用Pillow模块可以轻松创建和操作图片:
pip install Pillow
2. 生成验证码字符串
首先需要生成验证码字符串,可以自行编写生成函数,也可以使用Python提供的第三方库,比如PyCryptodome:
from Crypto.Random import get_random_bytes
import base64
def random_string(length):
b = get_random_bytes(length)
return base64.b64encode(b).decode('utf-8')[:length]
此处我们使用base64.b64encode来将随机字节编码成ASCII字符串,长度设定为传入参数length,并使用[:length]取得前length个字符。
3. 创建验证码图片
接下来,我们可以使用Pillow库来创建验证码图片:
from PIL import Image, ImageDraw, ImageFont
def create_image(code, fontsize):
# 设定图片大小以及背景色
width, height = fontsize * len(code) * 2, fontsize * 2
bg_color = '#ffffff'
# 创建Image对象
img = Image.new(mode='RGB', size=(width, height), color=bg_color)
# 创建Draw对象
draw = ImageDraw.Draw(img)
# 创建字体对象
font = ImageFont.truetype('arial.ttf', fontsize)
# 计算字体位置
text_width, text_height = draw.textsize(code, font=font)
pos = ((width - text_width) / 2, (height - text_height) / 2)
# 绘制文字
draw.text(pos, code, fill='black', font=font)
# 模糊处理
img = img.filter(ImageFilter.BLUR)
return img
为了生成验证码图片,我们使用了create_image函数,接受两个参数,一个是验证码字符串code,另一个是字体大小fontsize。
当我们得到验证码字符串和字体大小之后,我们通过以下代码创建一幅空图片:
img = Image.new(mode='RGB', size=(width, height), color=bg_color)
接着,我们创建了一个ImageDraw对象,用于在空图片上绘制文字:
draw = ImageDraw.Draw(img)
我们还创建了一个字体对象,此处使用了arial.ttf字体,当然也可以使用其他字体文件。
font = ImageFont.truetype('arial.ttf', fontsize)
我们通过以下代码计算字体在图片中的位置,并绘制文字:
text_width, text_height = draw.textsize(code, font=font)
pos = ((width - text_width) / 2, (height - text_height) / 2)
draw.text(pos, code, fill='black', font=font)
最后,我们对图片进行了模糊处理:
img = img.filter(ImageFilter.BLUR)
4. 示例 1
下面是一个完整的示例代码,我们生成了一个长度为4的随机码,并将其展示在一幅宽为200px,高为80px的图片中:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from Crypto.Random import get_random_bytes
import base64
def random_string(length):
b = get_random_bytes(length)
return base64.b64encode(b).decode('utf-8')[:length]
def create_image(code, fontsize):
# 设定图片大小以及背景色
width, height = fontsize * len(code) * 2, fontsize * 2
bg_color = '#ffffff'
# 创建Image对象
img = Image.new(mode='RGB', size=(width, height), color=bg_color)
# 创建Draw对象
draw = ImageDraw.Draw(img)
# 创建字体对象
font = ImageFont.truetype('arial.ttf', fontsize)
# 计算字体位置
text_width, text_height = draw.textsize(code, font=font)
pos = ((width - text_width) / 2, (height - text_height) / 2)
# 绘制文字
draw.text(pos, code, fill='black', font=font)
# 模糊处理
img = img.filter(ImageFilter.BLUR)
return img
if __name__ == '__main__':
code = random_string(4)
img = create_image(code=code, fontsize=25)
img.show()
5. 示例 2
下面是一个完整的示例代码,我们生成了一个长度为6的随机码,并将其储存为文件'/path/to/code.png':
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from Crypto.Random import get_random_bytes
import base64
def random_string(length):
b = get_random_bytes(length)
return base64.b64encode(b).decode('utf-8')[:length]
def create_image(code, fontsize):
# 设定图片大小以及背景色
width, height = fontsize * len(code) * 2, fontsize * 2
bg_color = '#ffffff'
# 创建Image对象
img = Image.new(mode='RGB', size=(width, height), color=bg_color)
# 创建Draw对象
draw = ImageDraw.Draw(img)
# 创建字体对象
font = ImageFont.truetype('arial.ttf', fontsize)
# 计算字体位置
text_width, text_height = draw.textsize(code, font=font)
pos = ((width - text_width) / 2, (height - text_height) / 2)
# 绘制文字
draw.text(pos, code, fill='black', font=font)
# 模糊处理
img = img.filter(ImageFilter.BLUR)
return img
if __name__ == '__main__':
code = random_string(6)
img = create_image(code=code, fontsize=30)
img.save('/path/to/code.png')
以上就是Python生成图形验证码的方法示例,我们可以根据实际需求调整参数以生成符合要求的验证码图片。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 生成图形验证码的方法示例 - Python技术站