init commit
This commit is contained in:
95
image_converter_gui.py
Normal file
95
image_converter_gui.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import os
|
||||
import tkinter as tk
|
||||
from tkinter import filedialog, messagebox
|
||||
from PIL import Image
|
||||
|
||||
class ImageConverterApp:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.root.title("图标格式转换工具")
|
||||
self.root.geometry("500x250")
|
||||
|
||||
# 存储选中的文件路径
|
||||
self.file_path = ""
|
||||
|
||||
# UI 布局
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
# 标题
|
||||
label_title = tk.Label(self.root, text="图片转 ICNS/ICO/PNG 工具", font=("Arial", 14, "bold"))
|
||||
label_title.pack(pady=20)
|
||||
|
||||
# 文件选择部分
|
||||
frame_file = tk.Frame(self.root)
|
||||
frame_file.pack(pady=10)
|
||||
|
||||
self.entry_path = tk.Entry(frame_file, width=40)
|
||||
self.entry_path.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
btn_browse = tk.Button(frame_file, text="选择图片", command=self.browse_file)
|
||||
btn_browse.pack(side=tk.LEFT)
|
||||
|
||||
# 开始转换按钮
|
||||
self.btn_convert = tk.Button(self.root, text="立即开始转换", command=self.convert_image,
|
||||
bg="#4CAF50", fg="white", font=("Arial", 10, "bold"), height=2, width=20)
|
||||
self.btn_convert.pack(pady=20)
|
||||
|
||||
def browse_file(self):
|
||||
file_types = [("Image files", "*.jpg *.jpeg *.png *.bmp *.webp")]
|
||||
filename = filedialog.askopenfilename(title="选择一张图片", filetypes=file_types)
|
||||
if filename:
|
||||
self.file_path = filename
|
||||
self.entry_path.delete(0, tk.END)
|
||||
self.entry_path.insert(0, filename)
|
||||
|
||||
def convert_image(self):
|
||||
if not self.file_path:
|
||||
messagebox.showwarning("提示", "请先选择一张图片!")
|
||||
return
|
||||
|
||||
input_path = self.file_path
|
||||
base_name = os.path.splitext(os.path.basename(input_path))[0]
|
||||
output_dir = os.path.dirname(input_path)
|
||||
|
||||
try:
|
||||
with Image.open(input_path) as img:
|
||||
# 1. 裁剪为 1:1
|
||||
width, height = img.size
|
||||
if width != height:
|
||||
new_side = min(width, height)
|
||||
left = (width - new_side) / 2
|
||||
top = (height - new_side) / 2
|
||||
right = (width + new_side) / 2
|
||||
bottom = (height + new_side) / 2
|
||||
img = img.crop((left, top, right, bottom))
|
||||
|
||||
# 统一转为 RGBA
|
||||
if img.mode != 'RGBA':
|
||||
img = img.convert('RGBA')
|
||||
|
||||
# 2. 保存 512x512 PNG
|
||||
png_path = os.path.join(output_dir, f"{base_name}_512.png")
|
||||
img.resize((512, 512), Image.Resampling.LANCZOS).save(png_path, "PNG")
|
||||
|
||||
# 3. 保存 ICNS
|
||||
icns_path = os.path.join(output_dir, f"{base_name}.icns")
|
||||
img.save(icns_path, format="ICNS")
|
||||
|
||||
# 4. 保存 256x256 ICO
|
||||
ico_256_path = os.path.join(output_dir, f"{base_name}_256.ico")
|
||||
img.resize((256, 256), Image.Resampling.LANCZOS).save(ico_256_path, format="ICO", sizes=[(256, 256)])
|
||||
|
||||
# 5. 保存 32x32 ICO
|
||||
ico_32_path = os.path.join(output_dir, f"{base_name}_32.ico")
|
||||
img.resize((32, 32), Image.Resampling.LANCZOS).save(ico_32_path, format="ICO", sizes=[(32, 32)])
|
||||
|
||||
messagebox.showinfo("成功", f"处理完成!\n文件已保存至:\n{output_dir}")
|
||||
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"处理失败: {str(e)}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = tk.Tk()
|
||||
app = ImageConverterApp(root)
|
||||
root.mainloop()
|
||||
Reference in New Issue
Block a user