Initial commit for profile CreateIconFromFilesPng

This commit is contained in:
VALLONGOL 2025-04-29 09:01:45 +02:00
commit ce375209ea
3 changed files with 184 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.svn
_dist/
_build/
*.ico
*.png

162
create_icon_file.py Normal file
View File

@ -0,0 +1,162 @@
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()

17
create_icon_file.spec Normal file
View File

@ -0,0 +1,17 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(scripts=['C:\\src\\____GitProjects\\CreateIconFromFilesPng\\create_icon_file.py'], pathex=['C:\\src\\____GitProjects\\CreateIconFromFilesPng'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False,)
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='create_icon_file',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,)
coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='create_icon_file',)