163 lines
5.5 KiB
Python
163 lines
5.5 KiB
Python
import tkinter as tk
|
|
from tkinter import filedialog, messagebox
|
|
from PIL import Image, ImageTk
|
|
import os
|
|
|
|
class PNGtoICOApp:
|
|
def __init__(self, root):
|
|
self.root = root
|
|
self.root.title("PNG to ICO Converter")
|
|
self.root.geometry("600x700")
|
|
self.root.resizable(False, False)
|
|
|
|
self.png_path = None
|
|
self.preview_img = None
|
|
self.ico_previews = []
|
|
|
|
self.label = tk.Label(root, text="Converti un file PNG in ICO", font=("Segoe UI", 12))
|
|
self.label.pack(pady=10)
|
|
|
|
self.preview_label = tk.Label(root, text="Nessuna immagine selezionata")
|
|
self.preview_label.pack()
|
|
|
|
self.image_label = tk.Label(root)
|
|
self.image_label.pack(pady=10)
|
|
|
|
self.select_button = tk.Button(root, text="Seleziona immagine PNG", command=self.select_image)
|
|
self.select_button.pack(pady=5)
|
|
|
|
self.convert_button = tk.Button(root, text="Converti in ICO", command=self.convert_to_ico, state=tk.DISABLED)
|
|
self.convert_button.pack(pady=5)
|
|
|
|
|
|
self.remove_bg_var = tk.BooleanVar(value=True)
|
|
self.remove_bg_checkbox = tk.Checkbutton(
|
|
root,
|
|
text="Rimuovi automaticamente lo sfondo bianco",
|
|
variable=self.remove_bg_var
|
|
)
|
|
self.remove_bg_checkbox.pack(pady=5)
|
|
|
|
|
|
# Contenitore scrollabile per le anteprime
|
|
self.canvas = tk.Canvas(root, height=300)
|
|
self.scroll_y = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
|
|
self.scroll_frame = tk.Frame(self.canvas)
|
|
|
|
self.scroll_frame.bind(
|
|
"<Configure>",
|
|
lambda e: self.canvas.configure(
|
|
scrollregion=self.canvas.bbox("all")
|
|
)
|
|
)
|
|
|
|
self.canvas.create_window((0, 0), window=self.scroll_frame, anchor="nw")
|
|
self.canvas.configure(yscrollcommand=self.scroll_y.set)
|
|
|
|
self.canvas.pack(side="left", fill="both", expand=True, padx=(20, 0))
|
|
self.scroll_y.pack(side="right", fill="y")
|
|
|
|
def select_image(self):
|
|
initial_dir = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
path = filedialog.askopenfilename(
|
|
title="Seleziona immagine PNG",
|
|
initialdir=initial_dir,
|
|
filetypes=[("PNG files", "*.png")]
|
|
)
|
|
if not path:
|
|
return
|
|
|
|
self.png_path = path
|
|
self.preview_label.config(text=os.path.basename(path))
|
|
|
|
img = Image.open(path)
|
|
img.thumbnail((128, 128))
|
|
self.preview_img = ImageTk.PhotoImage(img)
|
|
self.image_label.config(image=self.preview_img)
|
|
|
|
self.convert_button.config(state=tk.NORMAL)
|
|
self.clear_previews()
|
|
|
|
def convert_to_ico(self):
|
|
if not self.png_path:
|
|
messagebox.showwarning("Attenzione", "Seleziona prima un'immagine PNG.")
|
|
return
|
|
|
|
default_name = os.path.splitext(os.path.basename(self.png_path))[0] + ".ico"
|
|
output_path = filedialog.asksaveasfilename(
|
|
title="Salva come",
|
|
defaultextension=".ico",
|
|
initialfile=default_name,
|
|
initialdir=os.path.dirname(os.path.abspath(__file__)),
|
|
filetypes=[("ICO files", "*.ico")]
|
|
)
|
|
|
|
if not output_path:
|
|
return
|
|
|
|
try:
|
|
img = Image.open(self.png_path)
|
|
|
|
# Converti in RGBA per mantenere la trasparenza
|
|
if img.mode != "RGBA":
|
|
img = img.convert("RGBA")
|
|
|
|
# Rimuove sfondo bianco se rilevato
|
|
if self.remove_bg_var.get():
|
|
img = self.remove_white_background(img)
|
|
|
|
sizes = [(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]
|
|
img.save(output_path, sizes=sizes)
|
|
|
|
messagebox.showinfo("Conversione completata", f"Ico salvata in:\n{output_path}")
|
|
self.show_generated_previews(img, sizes)
|
|
|
|
except Exception as e:
|
|
messagebox.showerror("Errore", f"Errore durante la conversione:\n{str(e)}")
|
|
|
|
def remove_white_background(self, img):
|
|
datas = img.getdata()
|
|
newData = []
|
|
for item in datas:
|
|
# item è (R, G, B, A)
|
|
if item[0] > 240 and item[1] > 240 and item[2] > 240:
|
|
# Pixel bianco (o quasi): rendilo trasparente
|
|
newData.append((255, 255, 255, 0))
|
|
else:
|
|
newData.append(item)
|
|
img.putdata(newData)
|
|
return img
|
|
|
|
|
|
def show_generated_previews(self, img, sizes):
|
|
self.clear_previews()
|
|
|
|
title = tk.Label(self.scroll_frame, text="Anteprima dimensioni generate:", font=("Segoe UI", 10, "bold"))
|
|
title.grid(row=0, column=0, columnspan=3, pady=(10, 10))
|
|
|
|
columns = 3 # numero di colonne nella griglia
|
|
for i, size in enumerate(sizes):
|
|
preview = img.copy()
|
|
preview = preview.resize(size, Image.LANCZOS)
|
|
preview_img = ImageTk.PhotoImage(preview)
|
|
self.ico_previews.append(preview_img)
|
|
|
|
frame = tk.Frame(self.scroll_frame, padx=10, pady=10)
|
|
frame.grid(row=(i // columns) + 1, column=i % columns)
|
|
|
|
label = tk.Label(frame, text=f"{size[0]}x{size[1]}")
|
|
label.pack()
|
|
image_label = tk.Label(frame, image=preview_img)
|
|
image_label.pack()
|
|
|
|
def clear_previews(self):
|
|
for widget in self.scroll_frame.winfo_children():
|
|
widget.destroy()
|
|
self.ico_previews.clear()
|
|
|
|
if __name__ == "__main__":
|
|
root = tk.Tk()
|
|
app = PNGtoICOApp(root)
|
|
root.mainloop()
|