1. Automatisation du traitement des images en lot
Le traitement en lot des images permet d'effectuer les mêmes actions sur une grande quantité de fichiers, ce qui économise du temps et des efforts. Par exemple, si vous avez un répertoire d'images dont vous devez modifier la taille ou ajouter un filigrane, Pillow vous permet de créer un script unique qui appliquera les opérations sur toutes les images.
Modifier la taille de toutes les images dans un dossier
Dans cet exemple, nous allons redimensionner toutes les images dans le dossier input_images
et enregistrer les résultats dans le dossier output_images
.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Vérifions que le dossier pour enregistrer les images existe
os.makedirs(output_folder, exist_ok=True)
# Parcourons chaque fichier dans le dossier input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Ouvrons l'image et modifions sa taille
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Enregistrons l'image
resized_img.save(output_path)
print(f"L'image {filename} a été redimensionnée et enregistrée avec succès.")
Ce script :
- Charge tous les fichiers du dossier
input_images
. - Redimensionne chaque image à 800x800 pixels.
- Enregistre les images redimensionnées dans le dossier
output_images
.
Ajouter un filigrane sur les images
L'ajout d'un filigrane sur toutes les images d'un dossier peut être facilement automatisé. Dans cet exemple, un texte en filigrane est ajouté en bas à droite de chaque image.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"
# Vérifions que le dossier pour enregistrer les images existe
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)
# Ouvrons l'image et créons un objet de dessin
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Position pour le filigrane
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Ajoutons le filigrane
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"Un filigrane a été ajouté à l'image {filename}.")
Ce script :
- Charge toutes les images de
input_images
. - Ajoute un texte en filigrane en bas à droite de l'image.
- Enregistre le résultat dans
watermarked_images
.
Conversion des images au format PNG
La conversion des images dans un seul format peut également être automatisée. Dans cet exemple, nous convertissons toutes les images d'un dossier au format PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Vérifions que le dossier pour enregistrer les images existe
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)
# Ouvrons et convertissons l'image en 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"L'image {filename} a été convertie avec succès en PNG.")
Ce script convertit les images des formats JPEG, BMP et TIFF en PNG, en les enregistrant dans le dossier png_images
.
2. Travailler avec les animations GIF
Les animations GIF sont une séquence d'images qui sont affichées successivement, créant un effet de mouvement. Avec Pillow, vous pouvez créer et éditer des animations GIF, ajouter et modifier des frames, ainsi que gérer la vitesse de l'animation.
Créer une animation GIF simple
Pour créer une animation GIF, vous devez préparer plusieurs images (frames) qui seront affichées successivement. Dans cet exemple, nous créons un GIF à partir des images dans le dossier frames
.
# Liste d'images pour l'animation
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)
# Enregistrement des frames dans une animation GIF
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Ce code :
- Charge les images du dossier
frames
et les ajoute à la listeframes
. - Crée une animation GIF à partir de ces frames.
- Le paramètre
duration=100
indique la durée d'affichage de chaque frame en millisecondes, etloop=0
définit un cycle de lecture infini.
Modifier la vitesse d'une animation GIF
Pour modifier la vitesse de l'animation, il suffit de changer la valeur du paramètre duration
.
# Création d'une animation avec une vitesse augmentée
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
Dans cet exemple, duration=50
, ce qui accélère la lecture du GIF deux fois plus vite.
Ajouter de nouvelles frames à un GIF existant
Vous pouvez également ouvrir un GIF existant, y ajouter de nouvelles frames et enregistrer l'animation mise à jour.
# Ouverture d'un GIF existant
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Ajout d'une nouvelle frame
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Enregistrement de l'animation mise à jour
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Ce code ajoute une nouvelle frame new_frame.png
à la fin de l'animation.
Extraire des frames d'une animation GIF
Parfois, il est nécessaire de diviser une animation GIF en frames séparées. Pillow permet d'extraire et d'enregistrer chaque frame individuellement.
from PIL import ImageSequence
# Ouverture d'une animation GIF et extraction des frames
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Ce code enregistre chaque frame de l'animation en tant qu'image PNG distincte.
Exemple complet de travail avec les animations GIF et le traitement en lot
Pour conclure, voici un exemple combinant l'automatisation du traitement en lot et le travail avec les GIF. Nous créons une animation à partir de toutes les images dans un dossier, en modifiant la taille de chaque frame avant de l'ajouter.
# Chargement des images, modification de leur taille et création d'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