Skip to content

Disegnare cerchi, rettangoli, linee, ecc. con Python, Pillow

Python

Il modulo ImageDraw della libreria di elaborazione delle immagini Python Pillow (PIL) fornisce molti metodi per disegnare figure, come cerchi, quadrati e linee rette.

In questo articolo vengono descritti i seguenti contenuti.

  • Flusso di figura di disegno
  • Metodo di disegno
    • Parametri comuni
    • Esempio di metodo
  • Disegna sull’immagine esistente

Vedere il seguente articolo per l’installazione e l’utilizzo di base di Pillow (PIL).

Flusso di figura di disegno

Crea oggetto di disegno

Prepara un oggetto Immagine di un’immagine di sfondo (immagine per disegnare una figura) e usalo per creare un oggetto Disegna. Non dimenticare di importare Image e ImageDraw.

from PIL import Image, ImageDraw

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

Qui, crea un’immagine solida con Image.new(). La modalità, la dimensione e il colore di riempimento sono specificati nei parametri.

Disegna una forma con il metodo di disegno

Chiama il disegno dall’oggetto Draw per il metodo di disegnare una figura.

Disegna un’ellisse, un rettangolo e una linea retta come esempio. I parametri verranno descritti in seguito.

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)

Cuscino ImageDraw

Metodo di disegno

Parametri comuni

I seguenti parametri sono usati in molti metodi.

xy

Imposta un’area rettangolare per disegnare una figura.

Specificare in uno dei seguenti formati:

  • (((Coordinata x in alto a sinistra, coordinata y in alto a sinistra), (coordinata x in basso a destra, coordinata y in basso a destra))
  • (Coordinata x in alto a sinistra, coordinata y in alto a sinistra, coordinata x in basso a destra, coordinata y in basso a destra)

In line(), polygon() e point(), vengono specificate più coordinate invece di due punti che rappresentano un’area rettangolare.

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

line() disegna una linea retta che collega ogni punto, polygon() disegna un poligono in cui ogni punto è connesso e point() disegna un punto di 1 pixel in ogni punto.

compilare

Imposta il colore per compilare la forma.

Il formato delle specifiche varia a seconda della modalità dell’immagine (oggetto immagine).

  • RGB: imposta ogni valore di colore (0-255) sotto forma di (R, G, B)
  • L (Scala di grigi): impostare un valore (0-255) come numero intero

L’impostazione predefinita è Nessuno (nessun riempimento).

schema

Imposta il colore del bordo della figura.

Il formato delle specifiche del colore è lo stesso del riempimento sopra. L’impostazione predefinita è Nessuno (nessun bordo).

A partire dalla versione 4.4.0, non esiste alcuna opzione per impostare la larghezza della linea (spessore della linea) diversa da line().

Esempio di metodo

Vedere il documento ufficiale per i dettagli.

Ellisse, rettangolo

  • Ellisse (cerchio):ellipse(xy, fill, outline)
  • Rettangolo (quadrato):rectangle(xy, fill, outline)

ellisse() disegna un’ellisse tangente all’area rettangolare specificata dall’argomento xy. Se si specifica un quadrato, viene disegnato un vero cerchio.

I risultati dell’output sono come mostrato nell’esempio sopra.

Linea, poligono, punto

  • Linea:line(xy, fill, width)
    • xy
      • Imposta coordinate multiple di due o più punti come ((x1, y1), (x2, y2), (x3, y3)…).
      • Vengono tracciate le linee che collegano ciascun punto.
    • larghezza: larghezza della linea (spessore della linea)
      • Si noti che se si rende la larghezza della linea più spessa con la larghezza, specificando 3 punti o più con xy renderà la connessione poco attraente.

  • Poligono:polygon(xy, fill, outline)
    • xy
      • Imposta coordinate multiple di tre o più punti come ((x1, y1), (x2, y2), (x3, y3)…).
      • Viene disegnato un poligono in cui ogni punto è connesso.

  • Punto:point(xy, fill)
    • xy
      • Imposta coordinate multiple di uno o più punti come ((x1, y1), (x2, y2), (x3, y3)…).
      • Viene disegnato un punto pixel per ogni punto.

L’esempio di linee (line()), poligono (polygon()), point (point()) è il seguente il. Poiché il punto è 1 pixel, è difficile da vedere, ma è disegnato sul lato destro.

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))

Cuscino ImageDraw

Arco, accordo, torta

Vengono disegnati un arco, un accordo (arco) e una torta che tocca l’area rettangolare specificata dall’argomento xy.

  • Arco:arc(xy, start, end, fill)
    • inizio, bene
      • Imposta l’angolo dell’arco in gradi.
      • 0 gradi è la direzione delle 3 in punto. senso orario.

  • Accordo (arco):chord(xy, start, end, fill, outline)
    • I punti di inizio e fine dell’arco sono collegati da una linea retta.

  • Torta:pieslice(xy, start, end, fill, outline)
    • I punti di inizio e fine dell’arco sono collegati da una linea retta al centro del cerchio.

Esempio di arc (arc()), chord (chord()), pie (pieslice()) è il seguente il.

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))

Cuscino ImageDraw

Disegna sull’immagine esistente

Negli esempi precedenti, le figure sono disegnate sull’immagine solida generata da Image.new(). Se un file immagine esistente viene letto da Image.open(), può essere disegnato su di esso.

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))

Cuscino ImageDraw