2017-04-22 4 views
0

Bonne nuit. Aujourd'hui j'essaie d'apprendre PIL/Pillow en Python.Ecrire sur l'image à l'aide de PIL/PILLOW

J'ai utilisé le code suivant:

import PIL 
import PIL.Image as Image 
import PIL.ImageDraw as ImageDraw 
import PIL.ImageFont as ImageFont 

font = ImageFont.truetype("C:\Windows\Fonts\Verdanab.ttf", 80) 

img = Image.open("C:/Users/imagem/fundo_preto.png") 
draw = ImageDraw.Draw(img) 


filename = "info.txt" 
for line in open(filename): 
    print line 
    x = 0 
    y = 0 
    draw.text((x, y),line,(255,255,255),font=font) 
    img.save("a_test.png") 
    x += 10 
    y += 10 

Je sais que le don `t « draw.text() » oeuvres de fonction, mais j'ai essayé de writte ce qui suit sur une image de fond noir j'ai. Tout ce que je reçois, ce sont ces lignes les unes sur les autres sur la même ligne.

Comment cette fonction fonctionne-t-elle et comment puis-je obtenir la position des lignes à différents endroits au lieu d'une sur l'autre.

+0

L'initialisation de '' x' et y' doit être déplacé avant que la boucle, sinon 'x + = 10; y + = 10' n'aurait aucun effet. Aussi, je voudrais enregistrer l'image après la boucle. Le chemin de police peut être donné comme chaîne brute 'r 'C: \ Windows \ Fonts \ Verdana.ttf" 'pour empêcher la signification spéciale de la barre oblique inverse dans les chaînes. –

+0

Puisque nous parlons de polices. Étiez-vous obtenir une police qui émule une police de terminal? J'essaie d'émuler un écran d'un terminal d'invite de commande, mais la police que j'utilise n'est pas géniale pour ça. –

+0

Peut-être que vous voulez utiliser une police mono-espacée. BTW, une manière plus portable pour le répertoire de polices de Windows: 'os.path.join (os.environ ['WINDIR'], 'Fonts')'. –

Répondre

2

Vous réinitialisez x=0, y=0 à chaque fois dans la boucle: c'est la raison pour laquelle elle est elle-même surimprimée. À part ça, vous avez la bonne idée.

Déplacez ces lignes en dehors de votre boucle afin qu'elles ne soient réglées qu'une seule fois au début.

x = 0 
y = 0 

for line in open(filename): 
    print line 
    draw.text((x, y),line,(255,255,255),font=font) 
    img.save("a_test.png") 
    x += 10 
    y += 10 
+0

Btw, j'essaie d'utiliser la police de Windows Terminal, mais apparemment PIL ne le supporte pas. Comment utiliser la police du terminal? –

+0

L'image doit être enregistrée * après * la boucle une fois. –

1

extensions à answer de pbuck, qui déplace l'initialisation de x et y en dehors de la boucle.

  • Il n'est pas efficace de sauvegarder l'image dans le corps de la boucle. Cela devrait être déplacé après la boucle. Le chemin d'accès à la police doit utiliser le format de chaîne brut pour empêcher la signification spéciale de la barre oblique inverse. Alternativement, le backslash peut être doublé, ou le slash peut être utilisé.

  • Les polices de terminal sont généralement mono-espacées, ce qui n'est pas le cas pour Verdana. L'exemple ci-dessous utilise la police Consolas.

  • La taille de police est 80, l'incrément vertical doit donc être supérieur à 10 pour éviter la surimpression.

Fichier exemple:

import os 
import PIL.Image as Image 
import PIL.ImageDraw as ImageDraw 
import PIL.ImageFont as ImageFont 

fonts_dir = os.path.join(os.environ['WINDIR'], 'Fonts') 
font_name = 'consolab.ttf' 
font = ImageFont.truetype(os.path.join(fonts_dir, font_name), 80) 

img = Image.new("RGB", (400, 350), "black") 
draw = ImageDraw.Draw(img) 

filename = "info.txt" 
x = y = 0 
for line in open(filename): 
    print(line) 
    draw.text((x, y), line, (255, 255, 255), font=font) 
    x += 20 
    y += 80 

img.save("a_test.png") 

Result