Putting a unicode string on an ImageDraw canvas

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Putting a unicode string on an ImageDraw canvas

Thomas Larsen Wessel
People are telling me that PIL supports unicode strings, does it? And if yes, why does the following not work:

import ImageFont, Image, ImageDraw
s = u'\u0623\u0636\u0641'
im = Image.new('RGB', (200,200))
draw = ImageDraw.Draw(im)
draw.text((40,40), s) #fails

It results in the following exception:

Traceback (most recent call last):
  File "buffer.py", line 9, in <module>
    draw.text((40,40), s) #fails
  File "/usr/lib/python2.6/dist-packages/PIL/ImageDraw.py", line 267, in text
    mask = font.getmask(text, self.fontmode)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

So how, do I put this unicode string on the canvas?

Thanks in advance, Thomas


_______________________________________________
Image-SIG maillist  -  [hidden email]
http://mail.python.org/mailman/listinfo/image-sig
Reply | Threaded
Open this post in threaded view
|

Re: Putting a unicode string on an ImageDraw canvas

Fredrik Lundh
2011/1/10 Thomas Larsen Wessel <[hidden email]>:

> People are telling me that PIL supports unicode strings, does it? And if
> yes, why does the following not work:
>
> import ImageFont, Image, ImageDraw
> s = u'\u0623\u0636\u0641'
> im = Image.new('RGB', (200,200))
> draw = ImageDraw.Draw(im)
> draw.text((40,40), s) #fails
>
> It results in the following exception:
>
> Traceback (most recent call last):
>   File "buffer.py", line 9, in <module>
>     draw.text((40,40), s) #fails
>   File "/usr/lib/python2.6/dist-packages/PIL/ImageDraw.py", line 267, in
> text
>     mask = font.getmask(text, self.fontmode)
> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2:
> ordinal not in range(128)
>
> So how, do I put this unicode string on the canvas?

You'll need a font that supports Unicode, which the crappy default
bitmap font doesn't.  Use the ImageFont module to load a suitable
TrueType font.

</F>
_______________________________________________
Image-SIG maillist  -  [hidden email]
http://mail.python.org/mailman/listinfo/image-sig
Reply | Threaded
Open this post in threaded view
|

Re: Putting a unicode string on an ImageDraw canvas

Thomas Larsen Wessel
Thanks :)

Here is an example that shows how both draw.text and draw.textsize works, as long as a unicode-supported font is supplied. It also shows how to get the text size directly from the font object.

import ImageFont, Image, ImageDraw

s = u'\u0623\u0636\u0641'

font = ImageFont.truetype('/host/WINDOWS/Fonts/tahoma.ttf', 12, encoding='unic')
print font.getsize(s) # no problem, works fine

im = Image.new('RGB', (200,200))
draw = ImageDraw.Draw(im)
print draw.textsize(s, font=font) #fails




Thomas





On Mon, Jan 10, 2011 at 2:27 PM, Fredrik Lundh <[hidden email]> wrote:
2011/1/10 Thomas Larsen Wessel <[hidden email]>:
> People are telling me that PIL supports unicode strings, does it? And if
> yes, why does the following not work:
>
> import ImageFont, Image, ImageDraw
> s = u'\u0623\u0636\u0641'
> im = Image.new('RGB', (200,200))
> draw = ImageDraw.Draw(im)
> draw.text((40,40), s) #fails
>
> It results in the following exception:
>
> Traceback (most recent call last):
>   File "buffer.py", line 9, in <module>
>     draw.text((40,40), s) #fails
>   File "/usr/lib/python2.6/dist-packages/PIL/ImageDraw.py", line 267, in
> text
>     mask = font.getmask(text, self.fontmode)
> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2:
> ordinal not in range(128)
>
> So how, do I put this unicode string on the canvas?

You'll need a font that supports Unicode, which the crappy default
bitmap font doesn't.  Use the ImageFont module to load a suitable
TrueType font.

</F>


_______________________________________________
Image-SIG maillist  -  [hidden email]
http://mail.python.org/mailman/listinfo/image-sig
Reply | Threaded
Open this post in threaded view
|

Re: Putting a unicode string on an ImageDraw canvas

Fredrik Lundh
2011/1/10 Thomas Larsen Wessel <[hidden email]>:

> Thanks :)
>
> Here is an example that shows how both draw.text and draw.textsize works, as
> long as a unicode-supported font is supplied. It also shows how to get the
> text size directly from the font object.
>
> import ImageFont, Image, ImageDraw
>
> s = u'\u0623\u0636\u0641'
>
> font = ImageFont.truetype('/host/WINDOWS/Fonts/tahoma.ttf', 12,
> encoding='unic')
> print font.getsize(s) # no problem, works fine
>
> im = Image.new('RGB', (200,200))
> draw = ImageDraw.Draw(im)
> print draw.textsize(s, font=font) #fails

Hmm. That works for me in both 1.1.7 and trunk, and I don't really see
how it can fail for you given that it ends up calling the same method
in both cases:

    def textsize(self, text, font=None):
        if font is None:
            font = self.getfont()
        return font.getsize(text)

What's the exact error?

</F>
_______________________________________________
Image-SIG maillist  -  [hidden email]
http://mail.python.org/mailman/listinfo/image-sig