Script Python per l’Aggiunta di Filigrana a Cartelle di Immagini

Lo script utilizza PIL per aggiungere filigrane a immagini e tkinter per l’interfaccia grafica. Consente agli utenti di selezionare un’immagine di filigrana, una cartella contenente immagini e la posizione della filigrana.

Struttura e Funzionalità

  • Interfaccia Grafica Tkinter: Fornisce controlli interattivi per selezionare la posizione della filigrana, la cartella delle immagini e l’immagine della filigrana.
  • Aggiunta di Filigrane: Processa le immagini nella cartella specificata, applicando la filigrana in base alla posizione scelta.
  • Supporto Multiformato: Supporta formati immagine come JPG, PNG e WEBP.
  • Multithreading: Utilizza il threading per mantenere l’interfaccia utente reattiva durante l’elaborazione delle immagini.
import os
import threading
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image

def aggiungi_filigrana():
    posizione = posizione_var.get()
    percorso_cartella = percorso_cartella_var.get()
    percorso_filigrana = percorso_filigrana_var.get()

    if not percorso_cartella or not percorso_filigrana or not posizione:
        messagebox.showerror("Errore", "Per favore, riempi tutti i campi")
        return

    try:
        img_filigrana = Image.open(percorso_filigrana)
        img_filigrana = img_filigrana.convert("RGBA")
    except Exception as e:
        messagebox.showerror("Errore", f"Impossibile aprire la filigrana o il logo: {e}")
        return

    percorso_cartella_webp = os.path.join(percorso_cartella, "WebpFiligrana")
    os.makedirs(percorso_cartella_webp, exist_ok=True)

    files = [f for f in os.listdir(percorso_cartella) if f.endswith(('.jpg', '.png', '.webp'))]
    progressbar["maximum"] = len(files)

    def worker():
        for nome_file in files:
            percorso_immagine = os.path.join(percorso_cartella, nome_file)
            try:
                img = Image.open(percorso_immagine)
            except Exception as e:
                messagebox.showerror("Errore", f"Impossibile aprire l'immagine {nome_file}: {e}")
                continue

            if posizione == 'Centrale':
                posizione_filigrana = ((img.width - img_filigrana.width) // 2, (img.height - img_filigrana.height) // 2)
            elif posizione == 'In alto a destra':
                posizione_filigrana = (img.width - img_filigrana.width, 0)
            elif posizione == 'In alto a sinistra':
                posizione_filigrana = (0, 0)
            elif posizione == 'In basso a destra':
                posizione_filigrana = (img.width - img_filigrana.width, img.height - img_filigrana.height)
            elif posizione == 'In basso a sinistra':
                posizione_filigrana = (0, img.height - img_filigrana.height)

            img.paste(img_filigrana, posizione_filigrana, img_filigrana)

            nome_base = os.path.splitext(nome_file)[0]
            img.save(os.path.join(percorso_cartella_webp, f"{nome_base}.webp"), "WEBP")

            progressbar["value"] += 1
            root.update_idletasks()

        messagebox.showinfo("Successo", "Logo o Filigrana aggiunto con successo a tutte le immagini e salvate come WebP")

    threading.Thread(target=worker).start()

root = tk.Tk()
root.title("Aggiungi Logo")

posizione_var = tk.StringVar()
percorso_cartella_var = tk.StringVar()
percorso_filigrana_var = tk.StringVar()

ttk.Label(root, text="Posizione del Logo o Filigrana:").grid(row=0, column=0, sticky="w")
ttk.OptionMenu(root, posizione_var, "Centrale", "In alto a destra", "In alto a sinistra", "In basso a destra", "In basso a sinistra").grid(row=0, column=1, sticky="ew")

ttk.Label(root, text="Percorso della cartella con le immagini:").grid(row=1, column=0, sticky="w")
ttk.Entry(root, textvariable=percorso_cartella_var).grid(row=1, column=1, sticky="ew")
ttk.Button(root, text="Scegli Cartella...", command=lambda: percorso_cartella_var.set(filedialog.askdirectory())).grid(row=1, column=2, sticky="ew")


ttk.Label(root, text="Percorso del file Logo o Filigrana").grid(row=2, column=0, sticky="w")
ttk.Entry(root, textvariable=percorso_filigrana_var).grid(row=2, column=1, sticky="ew")
ttk.Button(root, text="Seleziona il Logo...", command=lambda: percorso_filigrana_var.set(filedialog.askopenfilename())).grid(row=2, column=2, sticky="ew")

progressbar = ttk.Progressbar(root, length=200)
progressbar.grid(row=3, column=0, columnspan=3, sticky="ew")

ttk.Button(root, text="Aggiungi Logo e Salva Immagini", command=aggiungi_filigrana).grid(row=4, column=0, columnspan=3)

root.mainloop()

Valutazione Tecnica

  • Usabilità: L’interfaccia utente è intuitiva, rendendo il processo di selezione e applicazione delle filigrane semplice e diretto.
  • Gestione delle Risorse: Gestisce bene le risorse, creando una nuova cartella per le immagini modificate.
  • Feedback Utente: Fornisce feedback visivo attraverso una barra di progresso e messaggi di completamento.
  • Robustezza: Implementa una solida gestione degli errori e dei casi limite.

Conclusioni

Lo script è un esempio efficace di come integrare le funzionalità di manipolazione immagini con un’interfaccia utente grafica. È ben progettato per essere sia funzionale che utente-friendly, rendendolo uno strumento utile per l’aggiunta rapida di filigrane alle immagini.