from PIL import Image, ImageDraw, ImageFont

def generate_student_card():
    # 1. 创建画布 (标准证件卡比例)
    width, height = 800, 500
    card = Image.new('RGB', (width, height), (255, 255, 255))
    draw = ImageDraw.Draw(card)

    # 2. 绘制视觉装饰
    # 顶部蓝色装饰条
    draw.rectangle([0, 0, width, 100], fill=(0, 51, 102))
    # 底部装饰条
    draw.rectangle([0, height-20, width, height], fill=(0, 51, 102))
    
    # 3. 加载字体
    # 注意：Windows系统通常在 C:/Windows/Fonts/simhei.ttf
    # 如果是Mac/Linux，请替换为系统内的中文字体路径
    try:
        font_title = ImageFont.truetype("simhei.ttf", 45)
        font_label = ImageFont.truetype("simhei.ttf", 28)
        font_info = ImageFont.truetype("simhei.ttf", 28)
    except:
        print("警告: 未找到指定中文字体，将使用默认字体(中文将显示为方块)")
        font_title = font_label = font_info = ImageFont.load_default()

    # 4. 写入校名
    draw.text((40, 25), "华夏示例理工大学", font=font_title, fill=(255, 255, 255))
    draw.text((620, 35), "学生证", font=font_info, fill=(255, 215, 0)) # 金色

    # 5. 处理头像
    try:
        # 尝试打开头像文件
        avatar = Image.open("avatar.jpg")
        avatar = avatar.resize((200, 260))
    except:
        # 如果没有头像文件，创建一个灰色占位框
        avatar = Image.new('RGB', (200, 260), (200, 200, 200))
        avatar_draw = ImageDraw.Draw(avatar)
        avatar_draw.text((60, 120), "PHOTO", fill=(100, 100, 100))

    # 将头像粘贴到卡片上
    card.paste(avatar, (540, 140))
    # 给头像画个细边框
    draw.rectangle([540, 140, 740, 400], outline=(150, 150, 150), width=2)

    # 6. 写入学生详细信息
    student_data = [
        ("姓    名:", "张三"),
        ("学    号:", "2023081234"),
        ("院    系:", "人工智能学院"),
        ("专    业:", "计算机科学与技术"),
        ("签发日期:", "2023年09月")
    ]

    x_label = 50
    x_content = 200
    y_start = 150
    line_spacing = 55

    for i, (label, content) in enumerate(student_data):
        curr_y = y_start + i * line_spacing
        draw.text((x_label, curr_y), label, font=font_label, fill=(100, 100, 100))
        draw.text((x_content, curr_y), content, font=font_info, fill=(0, 0, 0))

    # 7. 绘制公章 (半透明红色圆圈)
    # 创建一个透明层画印章
    overlay = Image.new('RGBA', card.size, (255, 255, 255, 0))
    overlay_draw = ImageDraw.Draw(overlay)
    # 画圆环
    overlay_draw.ellipse([350, 280, 500, 430], outline=(255, 0, 0, 180), width=5)
    # 印章文字
    overlay_draw.text((375, 340), "教务专用章", font=ImageFont.truetype("simhei.ttf", 20), fill=(255, 0, 0, 180))
    
    # 合并印章
    card = Image.alpha_composite(card.convert("RGBA"), overlay)

    # 8. 保存与展示
    card = card.convert("RGB") # 转回RGB以保存为JPG
    card.save("student_card.jpg")
    card.show()
    print("成功生成证件图：student_card.jpg")

if __name__ == "__main__":
    generate_student_card()