如何使用PIL绘制不同语言的文本

2024-04-25 06:02:04 发布

您现在位置:Python中文网/ 问答频道 /正文

更新(答复): 我自己找到了解决办法。只需在draw.text()函数中插入encode=“UTF-8”作为参数,即: font = ImageFont.truetype("18965.ttf", font_size, encoding="UTF-8")

问题:

我正在使用Pillow library v 8.0.1,我想创建一个包含文本的图像。唯一的问题是我不能简单地键入字符串,因为它被分配给另一个变量,所以我需要为字符串使用f前缀,即f'{some_value} не большой'。正如您在本例中看到的,字符串是俄语的,因此应该是分配给some_value的字符串。我被告知Python 3中的所有字符串都是unicode,因此我不编码它们,即我的解决方案如下所示:

el1 = f'{some_value} не большой'
img = Image.open('shopui.png', 'r') # 1842x1026
img_w, img_h = img.size
font_size = 12
font_color = (0, 0, 0)
background = Image.new('RGBA', (1440, 900), (255, 255, 255, 255))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("18965.ttf", font_size)
draw.text((10, 80), el1, font=font, fill=font_color)
img.save('shopui.png')  

这是执行上述代码后的错误消息:

rror from callback <bound method SocketHandler.handle_message of <amino.socket.SocketHandler object at 0x000002A497216A00>>: 'latin-1' codec can't encode characters in position 6-10: ordinal not in range(256)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\websocket\_app.py", line 344, in _callback
    callback(*args)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 80, in handle_message
    self.client.handle_socket_message(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\client.py", line 345, in handle_socket_message
    return self.callbacks.resolve(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 204, in resolve
    return self.methods.get(data["t"], self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 192, in _resolve_chat_message
    return self.chat_methods.get(key, self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 221, in on_text_message
    def on_text_message(self, data): self.call(getframe(0).f_code.co_name, objects.Event(data["o"]).Event)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 209, in call
    handler(data)
  File "C:\Users\1\Desktop\python bots\amino_faq\bot.py", line 125, in on_text_message
    upd_coins_and_level(difference, k, data.message.author.nickname, data.message.author.userId, activity,
  File "C:\Users\1\Desktop\python bots\amino_faq\bot.py", line 82, in upd_coins_and_level
    draw.text((10, 80), el1, font=font, fill=font_color)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\PIL\ImageDraw.py", line 379, in text
    draw_text(ink)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\PIL\ImageDraw.py", line 339, in draw_text
    mask = font.getmask(
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\PIL\ImageFont.py", line 148, in getmask
    return self.font.getmask(text, mode)

问题:

显而易见的解决方案是将u前缀附加到字符串上(我已经用这种字符串尝试过:u'some message'并且成功了!)。但是,正如您所看到的,我的字符串也由{some_value}组成,只能在字符串前面加上f前缀来显示

这是我无法理解的:如何在字符串之前同时使用uf前缀

我真的很感激任何帮助。先谢谢你


Tags: 字符串textinpymessagevenvlibpackages