Come si può allineare il centro (e allineare il mezzo verticale) quando si usa PIL?Testo allineato al centro/centrale con PIL?
risposta
Utilizzare Draw.textsize
method per calcolare la dimensione del testo e ricalcolare la posizione di conseguenza.
Ecco un esempio:
from PIL import Image, ImageDraw
W, H = (300,200)
msg = "hello"
im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, fill="black")
im.save("hello.png", "PNG")
e il risultato:
Utilizzare il metodo textsize
(vedere docs) per calcolare le dimensioni dell'oggetto di testo prima di disegnarlo effettivamente. Quindi disegnalo partendo dalle coordinate appropriate.
Ecco alcuni esempi di codice che utilizza textwrap dividere una linea lunga in pezzi, e quindi utilizza il textsize
metodo per calcolare le posizioni.
from PIL import Image, ImageDraw, ImageFont
import textwrap
astr = '''The rain in Spain falls mainly on the plains.'''
para = textwrap.wrap(astr, width=15)
MAX_W, MAX_H = 200, 200
im = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0))
draw = ImageDraw.Draw(im)
font = ImageFont.truetype(
'/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 18)
current_h, pad = 50, 10
for line in para:
w, h = draw.textsize(line, font=font)
draw.text(((MAX_W - w)/2, current_h), line, font=font)
current_h += h + pad
im.save('test.png')
+1 per esempio di utilizzo di parametro font opzionale – btk
Si potrebbe trovare un'implementazione di questo a http://tools.jedutils.com/tools/center-text-image
Si potrebbe utilizzare la pagina per creare l'immagine proprio lì, invece di attuare la routine di te stesso, ma il codice utilizzato è incluso nel pagina anche.
Si noti che il metodo Draw.textsize non è accurato. Stavo lavorando con immagini a basso pixel, e dopo alcuni test, si è scoperto che textize considera ogni personaggio di 6 pixel di larghezza, mentre un "I" occupa il massimo. 2 pixel e una "W" richiede min. 8 pixel (nel mio caso). E così, a seconda del mio testo, era o non era affatto centrato. Comunque, credo che "6" fosse una media, quindi se lavori con testi lunghi e immagini grandi, dovrebbe essere ancora ok.
Ma ora, se volete un po precisione reale, è meglio utilizzare il metodo getsize dell'oggetto tipo di carattere che si vuole utilizzare:
arial = ImageFont.truetype("arial.ttf", 9)
w,h = arial.getsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, font=arial, fill="black")
Come utilizzato nel collegamento di Edilio.
- 1. Testo nel footer Bootstrap allineato al centro
- 2. Testo allineato in JLabel
- 3. Centro Testo allineato per etichette
- 4. SVG Cerchia testo su textPath (allineato al centro)
- 5. Disegno di testo multilingue con PIL
- 6. Crea un alone attorno al testo in Python usando PIL?
- 7. Testo a capo in PIL
- 8. Elemento ionico con testo allineato a sinistra e a destra
- 9. TStatusBar con inferiore allineato pannello
- 10. Ottimizzare .png immagini con PIL
- 11. Python, PIL; Testo su immagine e caratteri
- 12. ListView fila styling - testo allineato a sinistra, e l'icona allineato a destra
- 13. Aggiungi testo su immagine utilizzando PIL
- 14. modulo html verticale allineato
- 15. Ritagliare un'immagine al centro usando PIL
- 16. Converti uscita pyBarcode al PIL file immagine
- 17. css: testo allineato alla parte superiore e inferiore delle cellule
- 18. Testo all'interno della cella della tabella allineato in modo errato
- 19. come assicurarsi che il testo dell'opzione di selezione sia allineato al centro in IE?
- 20. Centro dinamico Allineato ViewPager
- 21. Apertura PNG con PIL/Cuscino
- 22. Carica bitmap RGBA con PIL
- 23. Immagini con ritaglio automatico con PIL
- 24. Come posso generare miniature circolari con PIL?
- 25. Testo ruotato di 90 gradi, allineato alla pagina in alto a destra con CSS
- 26. rettangoli asse allineato intersezione
- 27. Elenco allineato a destra di CSS
- 28. Come inviare un'immagine generata da PIL al browser?
- 29. Bordo testo con css (bordo attorno al testo)
- 30. PIL ImageDraw.textsize restituisce un'altezza errata
draw.textsize: (self, text, font = None) – WeizhongTu
Se la dimensione del carattere è diversa, è importante includere il carattere in questo modo: 'draw.textsize (msg, font = myFont)', altrimenti ha vinto 't ottenere centrato correttamente – Coco