2013-05-04 2 views
55

Ho un'applicazione che carica un'immagine e quando l'utente fa clic su, per questa immagine viene visualizzata un'area di testo (utilizzando jquery), in cui l'utente può scrivere del testo sull'immagine. Quale dovrebbe essere aggiunto su Image.Aggiungi testo su immagine utilizzando PIL

Dopo aver fatto qualche ricerca su di esso, ho pensato che PIL (Python Imaging Library) può aiutarmi a farlo. Così ho provato un paio di esempi per vedere come funziona e sono riuscito a scrivere del testo su un'immagine. Ma penso che ci sia qualche differenza quando provo usando Python Shell e in ambiente web. Voglio dire che il testo nella textarea è molto grande in px. Come posso ottenere la stessa dimensione del testo quando si usa PIL come quello nella textarea?

Il testo è multilinea. Come posso renderlo multilinea nell'immagine anche usando PIL?

C'è un modo migliore rispetto all'utilizzo di PIL? Non sono del tutto sicuro, se questa è la migliore implementazione.

html:

<img src="images/test.jpg"/> 

sua l'immagine in fase di modifica

var count = 0; 
$('textarea').autogrow(); 
$('img').click(function(){ 
    count = count + 1; 
    if (count > 1){ 
     $(this).after('<textarea />'); 
     $('textarea').focus(); 
    } 
}); 

jQuery per aggiungere textarea. Anche l'area di testo è la posizione: dimensione assoluta e fissa.

Devo inserirlo in un modulo in modo da poter ottenere le coordinate dell'area di testo sull'immagine? Voglio scrivere un testo sull'immagine quando l'utente fa clic e lo salva sull'immagine.

+0

Perché vuoi scrivere un testo su un'immagine usando PIL (e io non sono sicuro che PIL aiuti in questo). Non è abbastanza buono per mostrare il testo in overlay, che è usato più comunemente nei cursori. – lalit

+1

Ne ho bisogno per un progetto voglio che l'immagine sia salvata. Pil può disegnare il testo su un'immagine usando ImageDraw, non so se c'è un altro modo. – Apostolos

+0

Sarà utile, se è possibile fornire il codice Python che si sta utilizzando? – lalit

risposta

106

Penso che il modulo ImageFont disponibile in PIL dovrebbe essere utile per risolvere il problema di dimensione del carattere del testo. Basta controllare quale tipo di carattere e dimensione sono appropriati per te e usa la seguente funzione per cambiare i valori dei font.

# font = ImageFont.truetype(<font-file>, <font-size>) 
# font-file should be present in provided path. 
font = ImageFont.truetype("sans-serif.ttf", 16) 

Così il vostro codice sarà qualcosa di simile a:

from PIL import Image 
from PIL import ImageFont 
from PIL import ImageDraw 

img = Image.open("sample_in.jpg") 
draw = ImageDraw.Draw(img) 
# font = ImageFont.truetype(<font-file>, <font-size>) 
font = ImageFont.truetype("sans-serif.ttf", 16) 
# draw.text((x, y),"Sample Text",(r,g,b)) 
draw.text((0, 0),"Sample Text",(255,255,255),font=font) 
img.save('sample-out.jpg') 

Potrebbe essere necessario mettere qualche sforzo in più per calcolare la dimensione del carattere. Nel caso in cui si desideri modificarlo in base alla quantità di testo che l'utente ha fornito in TextArea.

Per aggiungere del testo (oggetto multilinea) basta dare un'idea approssimativa di quanti caratteri possono venire in una riga, quindi probabilmente puoi scrivere una funzione di pre-pprocessing per il tuo testo, che in pratica trova il carattere che sarà l'ultimo in ogni riga e converte lo spazio bianco prima di questo carattere in una nuova riga.

+1

Questo è il mio pensiero iniziale.Quindi ho bisogno che i miei caratteri siano in una cartella specifica del mio server web per funzionare? Penso di sì. Wrapping text? C'è un modo standard o devo implementarne uno? – Apostolos

+0

È possibile mantenere il file del carattere ovunque nel server Web. Assicurati solo che il percorso che hai fornito sia corretto. – lalit

+3

@lalit Ho provato il tuo codice su una macchina Windows e ho ricevuto un errore per il font 'self.font = core.getfont (file, dimensione, indice, codifica) IOError: can not open resource. Come posso fornire un percorso al file del carattere? – LWZ

8

È possibile creare una cartella "caratteri" in una radice del progetto e inserire il file di caratteri (sans_serif.ttf) lì. Quindi puoi fare qualcosa del genere:

fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts') 
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24)