Opérations de base de Pillow Image

Après avoir installé la bibliothèque Pillow, nous devons importer les modules nécessaires :

# 导入模块
from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFont
import os

Image de test (à télécharger localement pour tester) :

Exemple

Voici un exemple complet illustrant les opérations suivantes :

  1. Ouvrir et afficher les informations de base de l'image
    • Format, taille, mode, etc.
  2. Redimensionner l'image
    • Redimensionner l'image aux dimensions spécifiées
  3. Recadrer l'image
    • Extraire une région spécifique de l'image d'origine
  4. Faire pivoter l'image
    • Pivoter de 45 degrés et conserver toute l'image
  5. Retourner l'image
    • Retournement horizontal et vertical
  6. Convertir le mode de couleur
    • Convertir une image en couleur en niveaux de gris
  7. Appliquer des filtres
    • Effets tels que flou, renforcement des contours, contour, etc.
  8. Ajuster les propriétés de l'image
    • Réglage de la luminosité, du contraste et de la netteté
  9. Ajouter du texte
    • Dessiner du texte sur l'image
  10. Fusionner des images
    • Assemblage simple d'images
  11. Enregistrer dans différents formats et qualités
    • PNG, BMP et JPEG de différentes qualités

Exemple

"""
Tutoriel sur les opérations de base sur les images avec Python Pillow
Image de test utilisée : tiger.jpeg
"""


from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFont
import os

def main():
    # S'assurer qu'il existe un dossier de sortie dans notre répertoire de travail
    output_dir = "output"
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
   
    # 1. Ouvrir l'image
    print("1. Ouvrir l'image")
    try:
        img = Image.open("tiger.jpeg")
        print(f"Image ouverte avec succès - Format : {img.format}, Taille : {img.size}, Mode : {img.mode}")
    except Exception as e:
        print(f"Impossible d'ouvrir l'image : {e}")
        return
   
    # 2. Afficher les informations de base sur l'image
    print("\n2. Informations de base sur l'image")
    print(f"Format de l'image : {img.format}")
    print(f"Taille de l'image (largeur x hauteur) : {img.size}")
    print(f"Mode de l'image : {img.mode}")
   
    # 3. Redimensionner l'image
    print("\n3. Redimensionner l'image")
    resized_img = img.resize((400, 300))
    resized_img.save(f"{output_dir}/resized_tiger.jpg")
    print("Image redimensionnée enregistrée")
   
    # 4. Recadrer l'image
    print("\n4. Recadrer l'image")
    # Zone de recadrage (gauche, haut, droite, bas)
    width, height = img.size
    crop_area = (width//4, height//4, 3*width//4, 3*height//4)  # Recadrer la zone centrale
    cropped_img = img.crop(crop_area)
    cropped_img.save(f"{output_dir}/cropped_tiger.jpg")
    print(f"Zone d'image recadrée {crop_area} et enregistrée")
   
    # 5. Rotation de l'image
    print("\n5. Rotation de l'image")
    rotated_img = img.rotate(45, expand=True)  # Rotation de 45 degrés, expand=True conserve toute l'image
    rotated_img.save(f"{output_dir}/rotated_tiger.jpg")
    print("Image pivotée enregistrée")
   
    # 6. Retourner l'image
    print("\n6. Retourner l'image")
    # Retournement horizontal
    h_flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
    h_flipped.save(f"{output_dir}/horizontal_flip_tiger.jpg")
    # Retournement vertical
    v_flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
    v_flipped.save(f"{output_dir}/vertical_flip_tiger.jpg")
    print("Images retournées horizontalement et verticalement enregistrées")
   
    # 7. Convertir le mode de couleur
    print("\n7. Convertir le mode de couleur")
    grayscale_img = img.convert('L')  # Convertir en niveaux de gris
    grayscale_img.save(f"{output_dir}/grayscale_tiger.jpg")
    print("Image en niveaux de gris enregistrée")
   
    # 8. Appliquer les filtres
    print("\n8. Appliquer les filtres")
    # Filtre de flou
    blurred_img = img.filter(ImageFilter.BLUR)
    blurred_img.save(f"{output_dir}/blurred_tiger.jpg")
    # Renforcement des contours
    edge_img = img.filter(ImageFilter.EDGE_ENHANCE)
    edge_img.save(f"{output_dir}/edge_enhanced_tiger.jpg")
    # Filtre de contours
    contour_img = img.filter(ImageFilter.CONTOUR)
    contour_img.save(f"{output_dir}/contour_tiger.jpg")
    print("Images enregistrées avec différents filtres appliqués")
   
    # 9. Ajuster la luminosité, le contraste et la netteté
    print("\n9. Ajuster les propriétés de l'image")
    # Augmenter la luminosité
    brightness = ImageEnhance.Brightness(img)
    bright_img = brightness.enhance(1.5)  # Luminosité augmentée de 50%
    bright_img.save(f"{output_dir}/brighter_tiger.jpg")
   
    # Augmenter le contraste
    contrast = ImageEnhance.Contrast(img)
    contrast_img = contrast.enhance(1.5)  # Contraste augmenté de 50%
    contrast_img.save(f"{output_dir}/contrast_tiger.jpg")
   
    # Augmenter la netteté
    sharpness = ImageEnhance.Sharpness(img)
    sharp_img = sharpness.enhance(2.0)  # Netteté augmentée de 100%
    sharp_img.save(f"{output_dir}/sharper_tiger.jpg")
    print("Image enregistrée après ajustements de luminosité, de contraste et de netteté")
   
    # 10. Ajouter du texte
    print("\n10. Ajouter du texte")
    # Créer une copie pour le dessin
    text_img = img.copy()
    draw = ImageDraw.Draw(text_img)
    # Essayer d'utiliser une police système, revenir à la police par défaut en cas d'échec
    try:
        # Différents systèmes d'exploitation peuvent nécessiter différents chemins de police
        # Exemple de chemin de police Windows
        font = ImageFont.truetype("arial.ttf", 36)
    except IOError:
        font = ImageFont.load_default()
   
    # Ajouter du texte à l'image
    draw.text((10, 10), "Tiger", fill=(255, 255, 255), font=font)
    text_img.save(f"{output_dir}/text_tiger.jpg")
    print("Image enregistrée avec le texte ajouté")
   
    # 11. Fusionner les images (assemblage simple)
    print("\n11. Fusionner les images")
    # Créer une nouvelle image avec deux fois la largeur de l'original et la même hauteur
    merged_img = Image.new('RGB', (width*2, height))
    # Placer l'image originale à gauche
    merged_img.paste(img, (0, 0))
    # Placer l'image en niveaux de gris à droite
    merged_img.paste(grayscale_img.convert('RGB'), (width, 0))
    merged_img.save(f"{output_dir}/merged_tiger.jpg")
    print("Image fusionnée enregistrée")
   
    # 12. Enregistrer dans différents formats
    print("\n12. Enregistrer dans différents formats")
    img.save(f"{output_dir}/tiger.png")  # Format PNG
    img.save(f"{output_dir}/tiger.bmp")  # Format BMP
   
    # Enregistrer au format JPEG avec réglage de qualité
    img.save(f"{output_dir}/tiger_high_quality.jpg", quality=95)  # Haute qualité
    img.save(f"{output_dir}/tiger_low_quality.jpg", quality=10)   # Basse qualité
    print("Images enregistrées dans différents formats et qualités")
   
    print("\nToutes les opérations sont terminées ! Les images traitées sont enregistrées dans le dossier 'output'.")

if __name__ == "__main__":
    main()

Le code utilise une approche structurée, avec des commentaires clairs pour chaque opération. Toutes les images traitées sont enregistrées dans le répertoireoutputpour faciliter la visualisation et la comparaison des résultats.

Utilisation :

  • Assurez-vous que l'image tiger.jpeg se trouve dans le même répertoire que le code
  • Exécutez le code, et diverses images traitées seront générées dans le dossier de sortie
  • Visualisez les différents effets de traitement en fonction des informations de sortie

Si le code ci-dessus s'exécute avec succès, la sortie du terminal sera :


Description de l'opération

1. Ouvrir l'image et obtenir des informations de base

Exemple

# Ouvrir le fichier image
img = Image.open("tiger.jpeg")

# Obtenir et afficher les informations de l'image
print(f"Format de l'image : {img.format}")  # par exemple, JPEG, PNG, etc.
print(f"Taille de l'image (largeur x hauteur) : {img.size}")  # e.g., (800, 600)
print(f"Mode de l'image : {img.mode}")  # par exemple, RGB, RGBA, L (niveaux de gris), etc.

Explication détaillée:

  • Image.open()La fonction est utilisée pour ouvrir un fichier image, et le paramètre est le chemin d'accès au fichier image.
  • img.formatAfficher le format de l'image (par ex., JPEG, PNG, GIF, etc.)
  • img.sizeRenvoie un tuple contenant la largeur et la hauteur, par ex., (800, 600)
  • img.modeAfficher le mode de couleur de l'image :
    • RGB: Image en couleur
    • RGBA: Image en couleur avec canal de transparence
    • L: Image en niveaux de gris
    • 1: Image binaire (noir et blanc)

2. Redimensionner l'image

Exemple

# Redimensionner l'image à 400x300 pixels
resized_img = img.resize((400, 300))

# Enregistrer l'image redimensionnée
resized_img.save("output/resized_tiger.jpg")

Explication détaillée:

  • resize()La méthode est utilisée pour modifier la taille de l'image, et le paramètre est un tuple contenant la nouvelle largeur et la nouvelle hauteur.
  • Cette méthode ne modifie pas l'image d'origine, mais retourne un nouvel objet image.
  • Par défaut, l'interpolation du plus proche voisin est utilisée. Pour un redimensionnement de meilleure qualité, vous pouvez ajouter des paramètres :resized_img = img.resize((400, 300), Image.LANCZOS)
  • save()La méthode enregistre l'image traitée dans le chemin spécifié.

3. Recadrer l'image

Exemple

# Obtenir la taille de l'image d'origine
width, height = img.size

# Définir la zone de recadrage (gauche, haut, droite, bas)
crop_area = (width//4, height//4, 3*width//4, 3*height//4)  # Recadrer la zone centrale

# Effectuer le recadrage
cropped_img = img.crop(crop_area)

# Enregistrer l'image recadrée
cropped_img.save("output/cropped_tiger.jpg")

Explication détaillée:

  • crop()La méthode est utilisée pour extraire une région rectangulaire de l'image.
  • La zone de recadrage est définie par un tuple(left, upper, right, lower)Définition :
    • left: coordonnée x de la limite gauche
    • upper: coordonnée y de la limite supérieure
    • right: coordonnée x de la limite droite
    • lower: coordonnée y de la limite inférieure
  • Dans l'exemple, nous avons recadré la partie centrale de l'image (la région du 1/4 à 3/4)
  • width//4in//est une division entière, garantissant que le résultat est un entier

4. Faire pivoter l'image

Exemple

# Faire pivoter l'image de 45 degrés et agrandir le canevas pour afficher l'image complète
rotated_img = img.rotate(45, expand=True)

# Enregistrer l'image pivotée
rotated_img.save("output/rotated_tiger.jpg")

Explication détaillée:

  • rotate()La méthode est utilisée pour faire pivoter l'image ; le premier paramètre est l'angle de rotation (dans le sens antihoraire, en degrés)
  • expand=TrueLe paramètre agrandit la taille de l'image de sortie pour contenir l'intégralité de l'image pivotée
  • Si ce n'est pas définiexpand=True, l'image pivotée sera recadrée pour correspondre à la taille d'origine
  • Par défaut, le centre de rotation est le point central de l'image

5. Retourner l'image

Exemple

# Retournement horizontal (miroir gauche-droite)
h_flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
h_flipped.save("output/horizontal_flip_tiger.jpg")

# Retournement vertical (miroir haut-bas)
v_flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
v_flipped.save("output/vertical_flip_tiger.jpg")

Explication détaillée:

  • transpose()La méthode est utilisée pour les opérations de retournement et de transposition d'image
  • Image.FLIP_LEFT_RIGHTLa constante représente un retournement horizontal (miroir gauche-droite)
  • Image.FLIP_TOP_BOTTOMLa constante représente un retournement vertical (miroir haut-bas)
  • En plus du retournement, d'autres constantes telles que peuvent également être utiliséesImage.ROTATE_90, Image.ROTATE_180, Image.ROTATE_270pour effectuer une rotation

6. Convertir le mode de couleur

Exemple

# Convertir l'image en niveaux de gris
grayscale_img = img.convert('L')

# Enregistrer l'image en niveaux de gris
grayscale_img.save("output/grayscale_tiger.jpg")

Explication détaillée:

  • convert()La méthode est utilisée pour changer le mode de l'image (espace colorimétrique)
  • Le paramètre'L'indique la conversion en une image en niveaux de gris (luminance)
  • Les autres modes couramment utilisés incluent :
    • 'RGB': couleur à trois canaux
    • 'RGBA': couleur à quatre canaux (avec transparence)
    • 'CMYK': mode d'impression quadrichromique CMJN
    • '1': image binaire (noir et blanc pur)
  • La conversion des modes peut réduire la taille du fichier ou préparer à un traitement spécifique

7. Appliquer des filtres d'image

Exemple

# Appliquer un filtre de flou
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save("output/blurred_tiger.jpg")

# Appliquer un filtre d'accentuation des contours
edge_img = img.filter(ImageFilter.EDGE_ENHANCE)
edge_img.save("output/edge_enhanced_tiger.jpg")

# Appliquer un filtre de contours
contour_img = img.filter(ImageFilter.CONTOUR)
contour_img.save("output/contour_tiger.jpg")

Explication détaillée:

  • filter()La méthode est utilisée pour appliquer divers effets de filtre prédéfinis à une image
  • ImageFilter.BLURElle floute l'image, comme un effet de mise au point douce
  • ImageFilter.EDGE_ENHANCERenforce les bords de l'image, rendant les contours plus visibles
  • ImageFilter.CONTOURDétecte les lignes de contour de l'image, produisant un effet de croquis
  • D'autres filtres couramment utilisés incluent :
    • ImageFilter.SHARPEN: Accentuer l'image
    • ImageFilter.EMBOSS: Effet de relief
    • ImageFilter.FIND_EDGES: Trouver les bords
    • ImageFilter.SMOOTH: Lisser l'image
  • Vous pouvez également créer des filtres personnalisés, tels que le flou gaussien :img.filter(ImageFilter.GaussianBlur(radius=2))

8. Ajuster les propriétés de l'image (luminosité, contraste, netteté)

Exemple

# Augmenter la luminosité (1.5 signifie une luminosité augmentée de 50%)
brightness = ImageEnhance.Brightness(img)
bright_img = brightness.enhance(1.5)
bright_img.save("output/brighter_tiger.jpg")

# Augmenter le contraste (1.5 signifie que le contraste est augmenté de 50%)
contrast = ImageEnhance.Contrast(img)
contrast_img = contrast.enhance(1.5)
contrast_img.save("output/contrast_tiger.jpg")

# Augmenter la netteté (2.0 signifie que la netteté est augmentée de 100%)
sharpness = ImageEnhance.Sharpness(img)
sharp_img = sharpness.enhance(2.0)
sharp_img.save("output/sharper_tiger.jpg")

Explication détaillée:

  • ImageEnhanceLe module fournit plusieurs classes d'amélioration pour ajuster différentes propriétés d'image
  • Chaque objet d'amélioration doit d'abord être initialisé avec un objet image
  • enhance()La méthode accepte un paramètre indiquant le degré d'amélioration :
    • Une valeur de 1.0 signifie que l'image d'origine reste inchangée
    • Une valeur supérieure à 1.0 indique un effet d'amélioration (par ex., 1.5 signifie une augmentation de 50%)
    • Une valeur inférieure à 1.0 indique un effet de réduction (par ex., 0.5 signifie une diminution de 50%)
  • En plus des trois améliorateurs présentés ci-dessus, il y a aussiImageEnhance.Colorpour ajuster la saturation des couleurs

9. Ajouter du texte à l'image

Exemple

# Créer une copie de l'image pour le dessin
text_img = img.copy()

# Créer un objet de dessin
draw = ImageDraw.Draw(text_img)

# Essayer de charger une police (utiliser la police par défaut si indisponible)
try:
    # Charger une police système de taille 36 pixels
    font = ImageFont.truetype("arial.ttf", 36)
except IOError:
    # Si la police spécifiée est introuvable, utiliser la police par défaut
    font = ImageFont.load_default()

# Ajouter du texte à l'image
draw.text((10, 10), "Tiger", fill=(255, 255, 255), font=font)

# Enregistrer l'image avec le texte ajouté
text_img.save("output/text_tiger.jpg")

Explication détaillée:

  • copy()La méthode crée une copie de l'image originale afin d'éviter de modifier l'image originale
  • ImageDraw.Draw()Crée un objet de dessin pour dessiner sur l'image
  • ImageFont.truetype()Utilisé pour charger des polices TrueType :
    • Le premier paramètre est le chemin du fichier de police (par exemple, "arial.ttf")
    • Le deuxième paramètre est la taille de la police (en pixels)
  • draw.text()Utilisé pour dessiner du texte sur l'image :
    • Le premier paramètre(10, 10)correspond aux coordonnées de position du texte (coin supérieur gauche)
    • Le deuxième paramètre est le contenu de texte à dessiner
    • fillLe paramètre spécifie la couleur du texte, ici elle est blanche(255, 255, 255)
    • fontLe paramètre spécifie la police à utiliser
  • Utilisertry-exceptbloc pour gérer d'éventuels échecs de chargement de police

10. Fusionner des images (assemblage simple)

Exemple

# Obtenir la taille de l'image d'origine
width, height = img.size

# Créer une nouvelle image vierge dont la largeur est le double de l'originale
merged_img = Image.new('RGB', (width*2, height))

# Coller l'image originale à gauche
merged_img.paste(img, (0, 0))

# Convertir l'image en niveaux de gris en RGB et la coller à droite
merged_img.paste(grayscale_img.convert('RGB'), (width, 0))

# Enregistrer l'image fusionnée
merged_img.save("output/merged_tiger.jpg")

Explication détaillée:

  • Image.new()Créer une nouvelle image vierge :
    • Le premier paramètre est le mode de couleur, le voici'RGB'
    • Le deuxième paramètre est la taille de l'image, ici c'est le double de la largeur et de la hauteur d'origine
  • paste()La méthode colle une image sur une autre :
    • Le premier paramètre est l'image à coller
    • Le deuxième paramètre correspond aux coordonnées de la position de collage (coin supérieur gauche)
  • convert('RGB')Convertir l'image en niveaux de gris en mode RGB car seules les images de même mode peuvent être collées ensemble
  • Cette méthode peut être utilisée pour créer des collages, des comparaisons côte à côte ou des collections de photos

11. Enregistrer dans différents formats et qualités

Exemple

# Enregistrer au format PNG (compression sans perte)
img.save("output/tiger.png")

# Enregistrer au format BMP (sans compression)
img.save("output/tiger.bmp")

# Enregistrer en JPEG de haute qualité (qualité 95%)
img.save("output/tiger_high_quality.jpg", quality=95)

# Enregistrer en JPEG de basse qualité (qualité 10%)
img.save("output/tiger_low_quality.jpg", quality=10)

Explication détaillée:

  • save()La méthode détermine automatiquement le format d'enregistrement en fonction de l'extension du fichier
  • Caractéristiques des différents formats :
    • PNG: Compression sans perte, prend en charge la transparence, adapté aux icônes, captures d'écran, etc.
    • JPEG: Compression avec perte, adaptée aux photos, ne prend pas en charge la transparence
    • BMP: Aucune compression, taille de fichier plus grande, mais conserve toutes les informations
    • GIF: Prend en charge l’animation, jusqu’à 256 couleurs
  • Pour le format JPEG, vous pouvez utiliser lequalityparamètre pour contrôler la qualité de compression :
    • La valeur va de 1 (qualité la plus faible, fichier le plus petit) à 95 (meilleure qualité, fichier plus volumineux)
    • La valeur par défaut est généralement 75
  • Différents réglages de qualité peuvent aider à équilibrer la qualité d’image et la taille du fichier

12. Créer le répertoire de sortie

Exemple

# S’assurer que le répertoire de sortie existe
output_dir = "output"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

Explication détaillée:

  • os.path.exists()Vérifier si le répertoire spécifié existe
  • os.makedirs()Créer le répertoire s’il n’existe pas
  • Ce code garantit que nous avons un emplacement pour enregistrer les images traitées
  • Placer toutes les images générées dans un répertoire séparé permet de mieux organiser le projet
Autres extensions