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( "", 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()