Initial commit for profile CreateIconFromFilesPng
This commit is contained in:
commit
ce375209ea
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.svn
|
||||
_dist/
|
||||
_build/
|
||||
*.ico
|
||||
*.png
|
||||
162
create_icon_file.py
Normal file
162
create_icon_file.py
Normal 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
17
create_icon_file.spec
Normal 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',)
|
||||
Loading…
Reference in New Issue
Block a user