Skip to content

Dessiner un cercle, un rectangle, une ligne, etc. avec Python, Pillow

Le module ImageDraw de la bibliothèque de traitement d’image Python Pillow (PIL) fournit de nombreuses méthodes pour dessiner des figures, telles que des cercles, des carrés et des lignes droites.

Cet article décrit le contenu suivant.

  • Flux de figures de dessin
  • Méthode de dessin
    • Paramètres communs
    • Exemple de méthode
  • Dessiner sur l’image existante

Consultez l’article suivant pour l’installation et l’utilisation de base de Pillow (PIL).

Flux de figures de dessin

Créer un objet de dessin

Préparez un objet Image d’une image d’arrière-plan (image pour dessiner une figure) et utilisez-le pour créer un objet Draw. N’oubliez pas d’importer Image et ImageDraw.

from PIL import Image, ImageDraw

im = Image.new('RGB', (500, 300), (128, 128, 128))
draw = ImageDraw.Draw(im)

Ici, créez une image solide avec Image.new(). Le mode, la taille et la couleur de remplissage sont spécifiés dans les paramètres.

Dessiner une forme avec la méthode de dessin

Appelez la méthode de dessin à partir de l’objet Draw pour dessiner une figure.

Dessinez une ellipse, un rectangle et une ligne droite à titre d’exemple. Les paramètres seront décrits ultérieurement.

draw.ellipse((100, 100, 150, 200), fill=(255, 0, 0), outline=(0, 0, 0))
draw.rectangle((200, 100, 300, 200), fill=(0, 192, 192), outline=(255, 255, 255))
draw.line((350, 200, 450, 100), fill=(255, 255, 0), width=10)

im.save('data/dst/pillow_imagedraw.jpg', quality=95)

Oreiller ImageDessiner

Méthode de dessin

Paramètres communs

Les paramètres suivants sont couramment utilisés dans de nombreuses méthodes.

xy

Définissez une zone rectangulaire pour dessiner une figure.

Spécifiez dans l’un des formats suivants :

  • (((Coordonnée x supérieure gauche, coordonnée y supérieure gauche), (coordonnée x inférieure droite, coordonnée y inférieure droite))
  • (Coordonnée x supérieure gauche, coordonnée y supérieure gauche, coordonnée x inférieure droite, coordonnée y inférieure droite)

Dans line(), polygon() et point(), plusieurs coordonnées sont spécifiées au lieu de deux points représentant une zone rectangulaire.

  • (x1, y1, x2, y2, x3, y3…)
  • ((x1, y1), (x2, y2), (x3, y3)…)

line() dessine une ligne droite reliant chaque point, polygon() dessine un polygone où chaque point est connecté, et point() dessine un point de 1 pixel à chaque point.

remplir

Définissez la couleur pour remplir la forme.

Le format de spécification diffère selon le mode de l’image (objet Image).

  • RVB : Définissez chaque valeur de couleur (0-255) sous la forme de (R, G, B)
  • L (niveaux de gris) : définir une valeur (0-255) sous forme d’entier

La valeur par défaut est Aucun (pas de remplissage).

présenter

Définissez la couleur de bordure de la figure.

Le format de spécification de la couleur est le même que pour le remplissage ci-dessus. La valeur par défaut est Aucun (pas de bordure).

Depuis la version 4.4.0, il n’y a pas d’option pour définir la largeur de ligne (épaisseur de ligne) autre que line().

Exemple de méthode

Voir le document officiel pour plus de détails.

Ellipse, rectangle

  • Ellipse (Cercle):ellipse(xy, fill, outline)
  • Rectangle (Carré):rectangle(xy, fill, outline)

ellipse() dessine une ellipse tangente à la zone rectangulaire spécifiée par l’argument xy. Si vous spécifiez un carré, un vrai cercle est dessiné.

Les résultats de sortie sont comme indiqué dans l’exemple ci-dessus.

Ligne, polygone, point

  • Ligne:line(xy, fill, width)
    • xy
      • Définissez plusieurs coordonnées de deux points ou plus comme ((x1, y1), (x2, y2), (x3, y3)…).
      • Des lignes reliant chaque point sont tracées.
    • largeur : largeur de ligne (épaisseur de ligne)
      • Notez que si vous rendez la largeur de la ligne plus épaisse avec width, spécifier 3 points ou plus avec xy rendra la connexion peu attrayante.

     

  • Polygone:polygon(xy, fill, outline)
    • xy
      • Définissez plusieurs coordonnées de trois points ou plus comme ((x1, y1), (x2, y2), (x3, y3)…).
      • Un polygone dans lequel chaque point est connecté est dessiné.

     

  • Indiquer:point(xy, fill)
    • xy
      • Définissez plusieurs coordonnées d’un ou plusieurs points comme ((x1, y1), (x2, y2), (x3, y3)…).
      • Un point de pixel est dessiné pour chaque point.

     

L’exemple de lignes (line()), polygone (polygon()), point (point()) est le suivant. Comme le point est de 1 pixel, il est difficile à voir, mais il est dessiné sur le côté droit.

im = Image.new('RGB', (500, 250), (128, 128, 128))
draw = ImageDraw.Draw(im)

draw.line(((30, 200), (130, 100), (80, 50)), fill=(255, 255, 0))
draw.line(((80, 200), (180, 100), (130, 50)), fill=(255, 255, 0), width=10)
draw.polygon(((200, 200), (300, 100), (250, 50)), fill=(255, 255, 0), outline=(0, 0, 0))
draw.point(((350, 200), (450, 100), (400, 50)), fill=(255, 255, 0))

Oreiller ImageDessiner

Arc, accord, tarte

Un arc, un accord (arc) et un secteur touchant la zone rectangulaire spécifiée par l’argument xy sont dessinés.

  • Arc:arc(xy, start, end, fill)
    • début Fin
      • Définissez l’angle de l’arc en degrés.
      • 0 degrés est la direction de 3 heures. dans le sens des aiguilles d’une montre.

     

  • Accord (archet):chord(xy, start, end, fill, outline)
    • Les points de départ et d’arrivée de l’arc sont reliés par une ligne droite.

     

  • À:pieslice(xy, start, end, fill, outline)
    • Les points de départ et d’arrivée de l’arc sont reliés par une ligne droite au centre du cercle.

     

Un exemple d’arc (arc()), d’accord (chord()), de tarte (pieslice()) est le suivant.

im = Image.new('RGB', (600, 250), (128, 128, 128))
draw = ImageDraw.Draw(im)

draw.arc((25, 50, 175, 200), start=30, end=270, fill=(255, 255, 0))
draw.chord((225, 50, 375, 200), start=30, end=270, fill=(255, 255, 0), outline=(0, 0, 0))
draw.pieslice((425, 50, 575, 200), start=30, end=270, fill=(255, 255, 0), outline=(0, 0, 0))

Oreiller ImageDessiner

Dessiner sur l’image existante

Dans les exemples précédents, les figures sont dessinées sur l’image solide générée par Image.new(). Si un fichier image existant est lu par Image.open(), il peut être dessiné dessus.

im = Image.open('data/src/lena.jpg')
draw = ImageDraw.Draw(im)

draw.pieslice((15, 50, 140, 175), start=30, end=330, fill=(255, 255, 0))

Oreiller ImageDessiner