基于python图片验证码的使用
# #安装pillow模块
# pip3 install pillow
import random
from PIL import Image, ImageDraw, ImageFont
def generate_code(length):
# 随机选择字符
characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# 生成指定长度的验证码
code = ''.join(random.choice(characters) for i in range(length))
return code
def generate_image(code, width, height, font_size):
# 创建一个新的图片对象
img = Image.new(mode='RGB', size=(width, height), color=(0, 255, 255))
# 创建一个画笔对象
draw = ImageDraw.Draw(img)
# 设置字体
font = ImageFont.truetype('arial.ttf', font_size)
# 获取字符的宽度和高度
# text_width, text_height = draw.textsize(code, font)
# 获取字符的宽度和高度
bbox = draw.textbbox((0, 0, width, height), code, font=font)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
# 将字符绘制在图片中央
x = (width - text_width) // 2
y = (height - text_height) // 2
draw.text((x, y), code, font=font, fill=(4, 0, 0))
# 添加干扰线
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)
# 添加干扰点
for i in range(50):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
# 返回验证码图片对象
return img
def save_image(img, path):
img.save(path)
if __name__ == '__main__':
from io import BytesIO
import sys
code = generate_code(4)
img = generate_image(code, 150, 50, 30)
# save_image(img, 'captcha.png')
# img.show()
stream = BytesIO() # 下文有解释
img.save(stream, 'png')
print(stream.getvalue())
f = open('hehe.png', 'wb')
f.write(stream.getvalue())
f.close()
user_input = input("请输入验证码:")
if user_input == code:
print("hehehe")
io.BytesIO简要介绍及示例
io.BytesIO 是 Python 内置的一个 I/O 类,用于在内存中读写二进制数据。它的作用类似于文件对象,但是数据并不是存储在磁盘上,而是存储在内存中的字节串。你可以像文件对象一样对其进行读写、查找和截断等操作。通常用来操作二进制数据,如图片、音频、视频等。也可以用于测试或者临时存储数据。
代码举例:
import io
写入二进制数据到 BytesIO 对象中
data = b"Hello, World!"
bio = io.BytesIO()
bio.write(data)
从 BytesIO 对象中读取二进制数据
bio.seek(0)
read_data = bio.read()
print(read_data) # 输出 b'Hello, World!'
在这个示例中,我们首先使用 io.BytesIO() 创建了一个 BytesIO 对象 bio,然后使用 bio.write() 方法向其中写入了一个二进制数据 data。接着我们使用 bio.seek(0) 将读写指针移动到起始位置,然后使用 bio.read() 方法从 BytesIO 对象中读取了数据,并将其存储在 read_data 变量中。最后我们输出了 read_data,可以看到其与原来的二进制数据 data 完全相同。
输出的为什么是b开头的
在 Python 中,以 b 开头的字符串表示的是二进制字符串(bytes)。这种字符串是由字节组成的,每个字节都有一个对应的整数值,范围在 0 到 255 之间。二进制字符串与普通字符串不同,因为普通字符串是由 Unicode 字符组成的,每个字符都对应一个 Unicode 码点。
在上面的示例中,我们在 data 变量中存储了一个二进制字符串,它以 b 开头。因此,当我们从 BytesIO 对象中读取数据并将其存储在 read_data 变量中时,它也是一个二进制字符串,同样以 b 开头。这是 Python 对二进制字符串的一种标识方式,用于区分它们与普通字符串的不同。
bytes转换成字符串
如果要将二进制字符串转换成普通字符串,可以使用字符串的 decode() 方法。decode() 方法将一个字节串(bytes)转换成一个字符串(str),需要指定一个编码方式。在不知道编码方式的情况下,可以使用默认编码方式(通常为 UTF-8)。
下面是一个示例:
import io
写入二进制数据到 BytesIO 对象中
data = b"Hello, World!"
bio = io.BytesIO()
bio.write(data)
从 BytesIO 对象中读取二进制数据并转换成字符串
bio.seek(0)
read_data = bio.read().decode()
print(read_data) # 输出 'Hello, World!'
在这个示例中,我们在读取二进制数据后,使用 decode() 方法将其转换成了一个普通字符串。如果不指定编码方式,则默认使用 UTF-8 编码。
————————————————
版权声明:本文为CSDN博主「魔都吴所谓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41604569/article/details/129835209
在这个示例中,我们在读取二进制数据后,使用 decode() 方法将其转换成了一个普通字符串。如果不指定编码方式,则默认使用 UTF-8 编码。
————————————————
版权声明:本文为CSDN博主「魔都吴所谓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41604569/article/details/129835209