CodeGym /Cours Java /Python SELF FR /GIF et Automatisation du traitement des images

GIF et Automatisation du traitement des images

Python SELF FR
Niveau 46 , Leçon 4
Disponible

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 :

  1. Charge tous les fichiers du dossier input_images.
  2. Redimensionne chaque image à 800x800 pixels.
  3. 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 :

  1. Charge toutes les images de input_images.
  2. Ajoute un texte en filigrane en bas à droite de l'image.
  3. 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 :

  1. Charge les images du dossier frames et les ajoute à la liste frames.
  2. Crée une animation GIF à partir de ces frames.
  3. Le paramètre duration=100 indique la durée d'affichage de chaque frame en millisecondes, et loop=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)
1
Опрос
Opérations complexes avec des images,  46 уровень,  4 лекция
недоступен
Opérations complexes avec des images
Opérations complexes avec des images
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION