J'ai commencé à apprendre python il y a une semaine et je veux écrire un petit programme qui convertit un email en image (.png) afin qu'il puisse être partagé sur des forums sans risquer d'obtenir beaucoup de spam. mails.
Il semble que la bibliothèque standard python ne contient pas de module capable de le faire, mais j'ai découvert qu'il y avait un module PIL pour cela (PIL.ImageDraw).
Mon problème est que je n'arrive pas à le faire fonctionner.
Donc, fondamentalement, mes questions sont les suivantes:
Merci de votre aide :)
Code actuel:
import Image
import ImageDraw
import ImageFont
def getSize(txt, font):
testImg = Image.new('RGB', (1, 1))
testDraw = ImageDraw.Draw(testImg)
return testDraw.textsize(txt, font)
if __name__ == '__main__':
fontname = "Arial.ttf"
fontsize = 11
text = "[email protected]"
colorText = "black"
colorOutline = "red"
colorBackground = "white"
font = ImageFont.truetype(fontname, fontsize)
width, height = getSize(text, font)
img = Image.new('RGB', (width+4, height+4), colorBackground)
d = ImageDraw.Draw(img)
d.text((2, height/2), text, fill=colorText, font=font)
d.rectangle((0, 0, width+3, height+3), outline=colorOutline)
img.save("D:/image.png")
utilisation ImageDraw.text
- mais il ne fait aucun formatage, il imprime juste une chaîne à l'emplacement donné
img = Image.new('RGB', (200, 100))
d = ImageDraw.Draw(img)
d.text((20, 20), 'Hello', fill=(255, 0, 0))
pour connaître la taille du texte:
text_width, text_height = d.textsize('Hello')
Lors de la création d'une image, ajoutez un argument supplémentaire avec la couleur requise (blanc):
img = Image.new('RGB', (200, 100), (255, 255, 255))
jusqu'à ce que vous enregistriez l'image avec Image.save
méthode, il n'y aurait pas de fichier. Ensuite, il ne s'agit que d'une transformation appropriée pour le mettre au format de votre interface graphique pour l'affichage. Cela peut être fait en encodant l'image dans un fichier image en mémoire:
import cStringIO
s = cStringIO.StringIO()
img.save(s, 'png')
in_memory_file = s.getvalue()
cela peut ensuite être envoyé à l'interface graphique. Ou vous pouvez envoyer des données bitmap brutes directes:
raw_img_data = img.tostring()
Les 3 premières lignes ne sont pas complètes, quand je ne me trompe pas. Le code correct serait:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont