1. Automazione dell'elaborazione batch di immagini
L'elaborazione batch delle immagini consente di eseguire le stesse operazioni su un gran numero di file, risparmiando tempo e fatica. Ad esempio, se hai una cartella di immagini da ridimensionare o su cui applicare un watermark, Pillow ti permette di creare uno script che applichi queste operazioni a tutte le immagini.
Ridimensionare tutte le immagini in una cartella
In questo esempio ridimensioniamo tutte le immagini nella cartella input_images
e salviamo i risultati nella cartella output_images
.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Assicuriamoci che la cartella per salvare le immagini esista
os.makedirs(output_folder, exist_ok=True)
# Iteriamo su ogni file nella cartella input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Apriamo l'immagine e ne cambiamo la dimensione
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Salviamo l'immagine
resized_img.save(output_path)
print(f"Immagine {filename} ridimensionata e salvata con successo.")
Questo script:
- Carica tutti i file dalla cartella
input_images
. - Ridimensiona ogni immagine a 800x800 pixel.
- Salva le immagini modificate nella cartella
output_images
.
Aggiungere un watermark sulle immagini
Aggiungere un watermark su tutte le immagini in una cartella può essere facilmente automatizzato. In questo esempio aggiungiamo un watermark testuale nell'angolo in basso a destra di ogni immagine.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# Assicuriamoci che la cartella per salvare le immagini esista
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Apriamo l'immagine e creiamo un oggetto per il disegno
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Posizione per il watermark
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Aggiungiamo il watermark
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"Watermark aggiunto all'immagine {filename}.")
Questo script:
- Carica tutte le immagini da
input_images
. - Aggiunge un watermark testuale nell'angolo in basso a destra dell'immagine.
- Salva il risultato nella cartella
watermarked_images
.
Conversione delle immagini al formato PNG
Convertire tutte le immagini in un unico formato è altrettanto semplice da automatizzare. In questo esempio convertiamo tutte le immagini di una cartella nel formato PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Assicuriamoci che la cartella per salvare le immagini esista
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".bmp", ".tiff")):
image_path = os.path.join(input_folder, filename)
# Apriamo e convertiamo l'immagine in formato PNG
with Image.open(image_path) as img:
base_filename = os.path.splitext(filename)[0]
output_path = os.path.join(output_folder, f"{base_filename}.png")
img.save(output_path, "PNG")
print(f"Immagine {filename} convertita con successo in PNG.")
Questo script converte immagini nei formati JPEG, BMP e TIFF in PNG, salvandole nella cartella png_images
.
2. Lavorare con le animazioni GIF
Le animazioni GIF sono una sequenza di immagini mostrate una dopo l'altra, creando un effetto di movimento. Con Pillow si possono creare e modificare animazioni GIF, aggiungere o cambiare frame, e controllare la velocità dell'animazione.
Creazione di una semplice animazione GIF
Per creare un'animazione GIF, è necessario preparare alcune immagini (frame) che verranno mostrate in sequenza. In questo esempio creiamo un GIF dalle immagini nella cartella frames
.
# Lista delle immagini per l'animazione
frames_folder = "frames/"
frames = []
for filename in sorted(os.listdir(frames_folder)):
if filename.endswith((".png", ".jpg")):
frame_path = os.path.join(frames_folder, filename)
frame = Image.open(frame_path)
frames.append(frame)
# Salviamo i frame come animazione GIF
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Questo codice:
- Carica immagini dalla cartella
frames
e le aggiunge alla listaframes
. - Crea un'animazione GIF da questi frame.
- Il parametro
duration=100
specifica la durata di ogni frame in millisecondi, eloop=0
imposta una riproduzione infinita.
Modifica della velocità di animazione GIF
Per modificare la velocità dell'animazione, basta cambiare il valore del parametro duration
.
# Creazione di un'animazione con velocità aumentata
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
In questo esempio duration=50
, rendendo la riproduzione del GIF due volte più veloce.
Aggiunta di nuovi frame a un GIF esistente
Puoi anche aprire un GIF esistente, aggiungere nuovi frame e salvare l'animazione aggiornata.
# Apertura di un GIF esistente
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Aggiunta di un nuovo frame
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Salvataggio dell'animazione aggiornata
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Questo codice aggiunge un nuovo frame new_frame.png
alla fine dell'animazione.
Estrazione dei frame da un'animazione GIF
Può essere utile dividere un'animazione GIF in singoli frame. Pillow permette di estrarre ogni frame e salvarlo separatamente.
from PIL import ImageSequence
# Apertura di una GIF e estrazione dei frame
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Questo codice salva ogni frame dell'animazione come immagine PNG separata.
Esempio completo di lavoro con GIF e automazione batch
Infine, ecco un esempio in cui si combinano l'automazione batch e la gestione delle GIF. Creiamo un'animazione da tutte le immagini in una cartella, ridimensionando ogni frame prima di aggiungerlo.
# Caricare immagini, ridimensionarle e creare un GIF
input_folder = "input_images/"
frames = []
new_size = (400, 400)
for filename in sorted(os.listdir(input_folder)):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:
resized_frame = img.resize(new_size)
frames.append(resized_frame)
GO TO FULL VERSION