from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from captcha.image import ImageCaptcha
import random, string
def get_captcha_picture():
chr_all = string.ascii_uppercase + string.digits # 只使用大写字母和数字,避免混淆
chr_4 = ''.join(random.sample(chr_all, 4))
# 使用PIL创建验证码图片(替代ImageCaptcha)
width, height = 120, 40
image = Image.new('RGB', (width, height), color=(240, 240, 240))
draw = ImageDraw.Draw(image)
try:
# 尝试使用系统字体
font = ImageFont.truetype("arial.ttf", size=24)
except IOError:
try:
# 尝试其他常见字体
font = ImageFont.truetype("DejaVuSans.ttf", size=24)
except IOError:
# 使用默认字体
font = ImageFont.load_default()
# 绘制验证码文本
for i, char in enumerate(chr_4):
x = 10 + i * 25 + random.randint(-3, 3)
y = 5 + random.randint(-3, 3)
draw.text((x, y), char, fill=(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)),
font=font)
# 添加干扰线
for _ in range(3):
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=(random.randint(150, 200), random.randint(150, 200), random.randint(150, 200)),
width=1)
# 添加噪点
for _ in range(50):
x = random.randint(0, width - 1)
y = random.randint(0, height - 1)
draw.point((x, y), fill=(random.randint(150, 200), random.randint(150, 200), random.randint(150, 200)))
# 将图片转换为二进制数据
buffered = BytesIO()
image.save(buffered, format="JPEG", quality=95) # 明确指定质量和格式
return image