web-dev-qa-db-fra.com

Convertir une chaîne en image en python

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:

  1. Comment dessiner un texte sur une image.
  2. Comment créer une image vierge (blanche)
  3. Existe-t-il un moyen de le faire sans réellement créer un fichier afin que je puisse l'afficher dans une interface graphique avant de l'enregistrer?

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")
18
Marco-
  1. 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')
    
  2. 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))
    
  3. 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()
    
23
Jan Spurny

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
0
Uwe_98