How to convert a string to an image?
Question:
I started to learn python a week ago and want to write a small program that converts a email to a image (.png) so that it can be shared on forums without risking to get lots of spam mails.
It seems like the python standard library doesn’t contain a module that can do that but I’ve found out that there’s a PIL
module for it (PIL.ImageDraw
).
My problem is that I can’t seem to get it working.
So basically my questions are:
- How to draw a text onto a image.
- How to create a blank (white) image
- Is there a way to do this without actually creating a file so that I can show it in a GUI before saving it?
Current Code:
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")
Answers:
-
use ImageDraw.text
– but it doesn’t do any formating, it just prints string at the given location
img = Image.new('RGB', (200, 100))
d = ImageDraw.Draw(img)
d.text((20, 20), 'Hello', fill=(255, 0, 0))
to find out the text size:
text_width, text_height = d.textsize('Hello')
-
When creating image, add an aditional argument with the required color (white):
img = Image.new('RGB', (200, 100), (255, 255, 255))
-
until you save the image with Image.save
method, there would be no file. Then it’s only a matter of a proper transformation to put it into your GUI’s format for display. This can be done by encoding the image into an in-memory image file:
import cStringIO
s = cStringIO.StringIO()
img.save(s, 'png')
in_memory_file = s.getvalue()
or if you use python3:
import io
s = io.BytesIO()
img.save(s, 'png')
in_memory_file = s.getvalue()
this can be then send to GUI. Or you can send direct raw bitmap data:
raw_img_data = img.tostring()
The first 3 lines are not complete, when I’m not wrong. The correct code would be:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
I started to learn python a week ago and want to write a small program that converts a email to a image (.png) so that it can be shared on forums without risking to get lots of spam mails.
It seems like the python standard library doesn’t contain a module that can do that but I’ve found out that there’s a PIL
module for it (PIL.ImageDraw
).
My problem is that I can’t seem to get it working.
So basically my questions are:
- How to draw a text onto a image.
- How to create a blank (white) image
- Is there a way to do this without actually creating a file so that I can show it in a GUI before saving it?
Current Code:
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")
-
use
ImageDraw.text
– but it doesn’t do any formating, it just prints string at the given locationimg = Image.new('RGB', (200, 100)) d = ImageDraw.Draw(img) d.text((20, 20), 'Hello', fill=(255, 0, 0))
to find out the text size:
text_width, text_height = d.textsize('Hello')
-
When creating image, add an aditional argument with the required color (white):
img = Image.new('RGB', (200, 100), (255, 255, 255))
-
until you save the image with
Image.save
method, there would be no file. Then it’s only a matter of a proper transformation to put it into your GUI’s format for display. This can be done by encoding the image into an in-memory image file:import cStringIO s = cStringIO.StringIO() img.save(s, 'png') in_memory_file = s.getvalue()
or if you use python3:
import io s = io.BytesIO() img.save(s, 'png') in_memory_file = s.getvalue()
this can be then send to GUI. Or you can send direct raw bitmap data:
raw_img_data = img.tostring()
The first 3 lines are not complete, when I’m not wrong. The correct code would be:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont