17

sto cercando di scalare dinamicamente il testo da posizionare su immagini di diverse dimensioni ma conosciuti. Il testo verrà applicato come filigrana. C'è un modo per ridimensionare il testo in relazione alle dimensioni dell'immagine? Non ho bisogno che il testo occupi l'intera area, solo per essere abbastanza visibile in modo che sia facilmente identificabile e difficile da rimuovere. Sto usando Python Imaging Library versione 1.1.7. su Linux.PIL come scalare dimensione del testo in relazione alla dimensione dell'immagine

Mi piacerebbe essere in grado di impostare il rapporto tra la dimensione del testo per le dimensioni dell'immagine, dicono come 1/10 delle dimensioni o qualcosa del genere.

Sono stato a guardare l'attributo dimensione del carattere per modificare la dimensione, ma non ho avuto fortuna nella creazione di un algoritmo per ridimensionarlo. Mi chiedo se c'è un modo migliore.

Tutte le idee su come avrei potuto raggiungere questo obiettivo?

Grazie

risposta

37

Si può solo incrementare la dimensione del carattere fino a trovare una forma. font.getsize() è la funzione che indica quanto è grande il testo renderizzato.

import ImageFont, ImageDraw, Image 

image = Image.open('hsvwheel.png') 
draw = ImageDraw.Draw(image) 
txt = "Hello World" 
fontsize = 1 # starting font size 

# portion of image width you want text width to be 
img_fraction = 0.50 

font = ImageFont.truetype("arial.ttf", fontsize) 
while font.getsize(txt)[0] < img_fraction*image.size[0]: 
    # iterate until the text size is just larger than the criteria 
    fontsize += 1 
    font = ImageFont.truetype("arial.ttf", fontsize) 

# optionally de-increment to be sure it is less than criteria 
fontsize -= 1 
font = ImageFont.truetype("arial.ttf", fontsize) 

print 'final font size',fontsize 
draw.text((10, 25), txt, font=font) # put the text on the image 
image.save('hsvwheel_txt.png') # save it 

Se questo non è abbastanza efficiente per voi, è possibile implementare un sistema di radice di accertamento, ma credo che la funzione è font.getsize() patate piccole rispetto al resto dei vostri processi di editing delle immagini.

+4

Ciao Paul, quello ha fatto il trucco. Grazie per l'aiuto – Shpongle

5

In generale, quando si cambia il tipo di carattere dimensionamento il suo non sarà un cambiamento lineare nella dimensione del carattere.

Non-linear Scaling

Ora questo spesso dipende dal software, font, ecc ... Questo esempio è stato preso da Typophile e utilizza LaTex + font Computer Modern. Come puoi vedere non è esattamente un ridimensionamento lineare. Quindi, se hai problemi con il ridimensionamento dei caratteri non lineari, non sono sicuro di come risolverlo, ma un suggerimento potrebbe essere.

  1. Render il carattere più vicino alla dimensione desiderata, poi scala che su/giù tramite regolare il ridimensionamento algoritmo di immagine ...
  2. Basta accettare che non sarà esattamente scala lineare e cercare di creare una sorta di tabella/algoritmo che selezionerà la dimensione del punto più vicina per il carattere da abbinare alla dimensione dell'immagine.
+0

Grazie per la risposta, il metodo suggerito da Paul risolti esso. Grazie comunque comunque. – Shpongle

+0

Il mio primo pensiero guardando l'immagine era "bene se non si scala l'altezza della linea con il testo, quindi di _course_ non sembrerà lineare". Ma confrontando la lunghezza delle linee, puoi vedere che la lunghezza renderizzata del font 6pt è più della metà del 12pt, e il 5pt è più della metà della lunghezza del 10pt. – Ian

Problemi correlati