from PIL import Image
import pillow_heif
import os
import tkinter as tk
from tkinter import filedialog, messagebox
def recycle_convert(org_path, dst_path):
"""递归转换 HEIC 文件为 JPG 文件"""
if os.path.isdir(org_path):
file_list = os.listdir(org_path)
for file in file_list:
sub_path = os.path.join(org_path, file)
recycle_convert(sub_path, dst_path)
elif os.path.isfile(org_path):
path, filename = os.path.split(org_path)
name, ext = os.path.splitext(filename)
if ext.lower() == ".heic":
try:
heif_file = pillow_heif.read_heif(org_path)
image = Image.frombytes(
heif_file.mode,
heif_file.size,
heif_file.data,
"raw",
heif_file.mode,
heif_file.stride,
)
file_path = os.path.join(dst_path, f"{name}.jpg")
image.save(file_path, "JPEG")
except Exception:
pass
def select_folder(entry_field):
"""打开文件夹选择对话框并更新输入框的内容"""
folder_selected = filedialog.askdirectory()
if folder_selected:
entry_field.delete(0, tk.END)
entry_field.insert(0, folder_selected)
def execute_conversion(input_path, output_path):
"""执行文件夹转换"""
if not os.path.exists(input_path):
messagebox.showerror("Error", "Input folder does not exist.")
return
if not os.path.exists(output_path):
os.makedirs(output_path)
recycle_convert(input_path, output_path)
messagebox.showinfo("Success", "Conversion completed successfully!")
def handle_drag(event, entry_field):
"""处理拖拽文件夹事件"""
folder_path = event.widget.get().strip()
if os.path.isdir(folder_path):
entry_field.delete(0, tk.END)
entry_field.insert(0, folder_path)
else:
messagebox.showerror("Error", "Please drag a valid folder.")
def main():
"""创建主 GUI 界面"""
root = tk.Tk()
root.title("HEIC to JPG Converter")
# 输入文件夹部分
tk.Label(root, text="Input Folder:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
input_folder = tk.Entry(root, width=50)
input_folder.grid(row=0, column=1, padx=10, pady=10)
tk.Button(root, text="Browse", command=lambda: select_folder(input_folder)).grid(row=0, column=2, padx=10, pady=10)
# 输出文件夹部分
tk.Label(root, text="Output Folder:").grid(row=1, column=0, padx=10, pady=10, sticky="w")
output_folder = tk.Entry(root, width=50)
output_folder.grid(row=1, column=1, padx=10, pady=10)
tk.Button(root, text="Browse", command=lambda: select_folder(output_folder)).grid(row=1, column=2, padx=10, pady=10)
# 执行按钮
tk.Button(
root,
text="Convert",
command=lambda: execute_conversion(input_folder.get(), output_folder.get())
).grid(row=2, column=0, columnspan=3, pady=20)
root.mainloop()
if __name__ == "__main__":
main()