import tkinter as tk
from tkinter import filedialog, messagebox
import qrcode
from PIL import Image


# 生成二维码的函数
def generate_qr():
    text = text_input.get("1.0", tk.END).strip()  # 获取用户输入的文字
    if not text:
        messagebox.showerror("错误", "请输入内容！")
        return

    # 选择保存路径
    save_path = filedialog.asksaveasfilename(
        defaultextension=".png",
        filetypes=[("PNG 图片", "*.png"), ("所有文件", "*.*")]
    )
    if not save_path:
        return  # 用户取消保存时退出

    try:
        # 调用 qrcode 库生成二维码
        qr = qrcode.QRCode(
            version=1,  # 控制二维码大小，1~40
            error_correction=qrcode.constants.ERROR_CORRECT_H,  # 容错率，可选 L, M, Q, H
            box_size=10,  # 每个模块的像素大小
            border=4,  # 边框宽度（模块单位）
        )
        qr.add_data(text)  # 添加内容
        qr.make(fit=True)  # 适配大小

        # 生成二维码图片
        qr_img = qr.make_image(fill_color="black", back_color="white").convert("RGBA")

        # 将二维码中的白色背景透明化
        qr_img = make_background_transparent(qr_img)

        # 如果选择了背景图片，将其融合到二维码中
        if bg_image_path.get():
            bg_img = Image.open(bg_image_path.get()).convert("RGBA")
            qr_img = blend_qr_with_bg(qr_img, bg_img)

        qr_img.save(save_path)  # 保存图片
        messagebox.showinfo("成功", f"二维码已生成并保存至：\n{save_path}")
    except Exception as e:
        messagebox.showerror("错误", f"生成二维码失败：\n{e}")


# 选择背景图片的函数
def select_bg_image():
    file_path = filedialog.askopenfilename(
        filetypes=[("图片文件", "*.png;*.jpg;*.jpeg"), ("所有文件", "*.*")]
    )
    if file_path:
        bg_image_path.set(file_path)
        bg_label.config(text=f"已选择背景图片：{file_path}")


# 将二维码和背景图片融合的函数
def blend_qr_with_bg(qr_img, bg_img):
    # 调整背景图片大小与二维码一致
    bg_img = bg_img.resize(qr_img.size, Image.Resampling.LANCZOS)

    # 将二维码与背景图片融合
    # 将二维码图像直接粘贴到背景图上
    bg_img.paste(qr_img, (0, 0), qr_img)

    return bg_img


# 将二维码图像中的白色背景转为透明
def make_background_transparent(img):
    # 获取图片的像素数据
    img_data = img.getdata()

    # 创建新的像素列表，透明化白色背景
    new_data = []
    for item in img_data:
        # 如果是白色背景（RGB: 255, 255, 255），则设置透明度为 0
        if item[0] == 255 and item[1] == 255 and item[2] == 255:
            new_data.append((255, 255, 255, 0))  # 透明
        else:
            new_data.append(item)  # 保留原始颜色

    # 更新图像数据
    img.putdata(new_data)
    return img


# 创建主窗口
window = tk.Tk()
window.title("二维码生成器")
window.geometry("500x400")

# 创建输入框和标签
label = tk.Label(window, text="请输入内容：", font=("Arial", 12))
label.pack(pady=10)

text_input = tk.Text(window, height=6, width=50)
text_input.pack(pady=10)

# 背景图片选择
bg_image_path = tk.StringVar()  # 用于存储背景图片路径
bg_button = tk.Button(window, text="选择背景图片", font=("Arial", 12), command=select_bg_image)
bg_button.pack(pady=5)

bg_label = tk.Label(window, text="未选择背景图片", font=("Arial", 10))
bg_label.pack(pady=5)

# 创建生成按钮
generate_button = tk.Button(window, text="生成二维码", font=("Arial", 12), command=generate_qr)
generate_button.pack(pady=10)

# 启动主循环
window.mainloop()
