2009-12-27 13 views
5

Io uso i seguenti due metodi per generare il testo anteprima immagine per un file di font TTFGetize() di ImageFont non ottiene la dimensione corretta del testo?

metodo PIL:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    try: 
     font = ImageFont.truetype(fontfile, fontsize) 
     text_width, text_height = font.getsize(text) 
     img = Image.new('RGBA', (text_width, text_height)) 
     draw = ImageDraw.Draw(img) 
     draw.text((0, 0), text, font=font, fill=(0, 0, 0)) 
     return True 
    except: 
     return False 

ImageMagick metodo:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.Popen(['convert', '-font', fontfile, '-background', 
      'transparent', '-gravity', 'center', '-pointsize', str(fontsize), 
      '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Entrambi i metodi creare le immagini di anteprima corrette la maggior parte del tempo, ma in alcuni rari casi (< 2%), il font.getsize (testo) è solo cann Ot ottenere la dimensione corretta del testo che risulta in testo fornito overflow di tela. ImageMagick ha lo stesso problema.

font di esempio e anteprime:

HANFORD.TTF http://download.appfile.com/HANFORD.png

NEWTOW.TTF http://download.appfile.com/NEWTOW.png

MILF.TTF http://download.appfile.com/MILF.png

SWANSE.TTF http://download.appfile.com/SWANSE.png

Ho esaminato le documentazioni di ImageMagick e ha trovato la spiegazione di questo problema a http://www.imagemagick.org/Usage/text/#overflow.

È possibile rilevare tale testo in eccesso e disegnare il testo per adattarlo alla tela come previsto?

risposta

1

In questo caso, è sufficiente specificare ImageMagick per utilizzare una dimensione di tela più grande con una dimensione di carattere fissa e trarrà il testo in base alle dimensioni specificate, pur mantenendo la sua integrità.

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.call(['convert', '-font', fontfile, '-background', 
     'transparent', '-gravity', 'center', '-size', '1500x300', 
     '-pointsize', str(fontsize), '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Se è necessario per adattare il testo in tela specificato piuttosto che utilizzare una dimensione di punto fisso, potrebbe essere necessario ridimensionare l'immagine di uscita dopo che è stato creato.

PIL non funziona molto bene disegnando caratteri esotici, indipendentemente dalla dimensione in punti specificata per caricare un font, esso sempre sovrasta il testo all'esterno dell'immagine di output.

2

Ho avuto un problema simile una volta in PHP e ImageMagick.

Alla fine, ho risolto questo problema disegnando il testo su una tela molto grande, e poi ritagliandolo usando le funzioni trim/auto-crop che depongono ulteriore spazio fuori dall'immagine.

Se ho capito bene la funzione di anteprima, in realtà sta già facendo esattamente questo: dovrebbe essere sufficiente rimuovere solo le impostazioni di larghezza e altezza.

+0

@Pekka, il metodo può opere con IM, ma si creerà grande testa, non solo tagliare, ma anche il ridimensionamento dell'immagine ritagliata per adattarsi a dimensioni di tela specificato. Questo non funziona con PIL. Disegna sempre la metà superiore dei caratteri sopra anche se creo una tela più grande. – jack

+0

Prova a mettere il comando "label" * prima * dei comandi trim e repage, che dovrebbe funzionare. L'overhead, non posso aiutare. –

5

alt text http://img9.imageshack.us/img9/2419/fontfix.jpg

Non una soluzione di programmazione, ma quando ho rigenerare il problema, la sua verifica solo sui font (altri tipi di carattere come Arial non è un problema a tutti), così mi hanno fissato i vostri file di font (cambiando salita/metriche decenti).è possibile scaricare here,

E mi dispiace per Hanford Script Font, non è perfetto come vedi, l'altezza sembra ok, ma il lato sinistro non viene disegnato, è fuori dalla mia comprensione.

UPDATE: Per quanto riguarda Hanford Font, Ecco un lavoro in giro, passare spazio nel testo come "Handford Script", e poi ritagliare lo spazio in più in immagine come img=img.crop(img.getbbox())

alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround.jpg

UPDATE2: ho dovuto passare color = (255,255,255) in Image.New per ottenere testo nero su sfondo bianco

img = Image.new('RGBA', (text_width, text_height),color=(255,255,255)) 

alt text http://img245.imageshack.us/img245/3462/colorblackh.jpg

+0

come modificare la metrica ascesa/decente per un carattere specificato? È necessaria la ricalibrazione manuale in base al tipo di carattere? – jack

+0

Ho usato fontforge per modificare quei font, jack. – YOU

+0

A causa di problemi di copyright, penso che sia meglio lasciare il font così com'è e disegnare il testo su una tela più grande e poi ritagliarlo. ma il tuo metodo ha funzionato per uso personale. Grazie per il tuo consiglio. – jack

Problemi correlati