【问题标题】:Devanagari text rendering improperly in PyGamePyGame 中的梵文文本渲染不正确
【发布时间】:2017-10-30 10:51:20
【问题描述】:

我们有一个小型网络应用程序,我们希望将其转换为原生应用程序。现在,它有很多移动部件(后端、浏览器等),我们希望将它转换成一个紧凑的应用程序。我们决定使用 PyGame 来执行此操作,到目前为止一切正常,除了字体渲染问题。

我要渲染的字符串是कोझिकोड。这个,正确渲染看起来像

具体码位为\u0915 \u094b \u091d \u093f \u0915 \u094b和\u0921

现在,这在我的编辑器和浏览器中看起来不错,但是当我尝试在 PyGame 中渲染它时,我得到了这个。基本上,元音符号 (\u093f ि) 应该在 झ 的左边,但它出现在它的右边(和 क 的左边),从而完全搞砸了。这不会发生在浏览器或文本编辑器(使用相同的输入字符串)中,所以我猜这是 PyGame 中的渲染器问题。

有一个粗略的修复方法仅适用于这种特定情况,即把 ि (\u093f) 放在 झ (\u091d) 之前。在这种情况下,它会像 一样正确呈现。这取决于我对语言的了解并将该逻辑放入代码中。我必须在这里处理多种语言,所以这并不可行。

我对 unicode 没有太多经验,所以我不知道如何解决这个问题。我能做些什么来解决这个问题吗?

如果重要的话,我会使用 Debian 上的 freesans 字体,它有必要的字形来呈现它。

更新: 实际渲染的代码如下

# -*- coding: utf-8 -*-
import time

import pygame

# Pygame setup and create root window
pygame.font.init()
screen = pygame.display.set_mode((320, 200))
empty = pygame.Surface((320, 200))


font_file = pygame.font.match_font("freesans")  # Select and
font = pygame.font.Font(font_file, 30)          # open the font
writing = font.render(u"कोिझकोड  कोझिकोड", True, (0, 0, 0))  # Render text on a surface
screen.fill((255, 255, 255)) # Clear the background
screen.blit(writing, (10, 10)) # Blit the text surface on the background
pygame.display.flip()  # Refresh the display

input() # Wait for input before quitting

这就是的样子

第一个单词被正确呈现,但我们已经通过反转元音和字母位置来完成它,正如我在粗略的修复中提到的那样。第二个写得正确但渲染不正确。

更新 2: 在没有其他任何东西的情况下,我决定尝试使用外部程序将字符串渲染成图像,然后将该图像blit到PyGame Surface上。我尝试了 imagemagick,但它以与此相同的方式使我们感到困惑。 Gimp 工作正常,所以我打算使用批处理模式来完成我的工作。

【问题讨论】:

  • 顺便说一句,我注意到,几年前,similar bug 影响了 chromium 浏览器。
  • 您应该打开针对 SDL_ttf 的错误报告。其他字体渲染器做对了,它再次证明渲染文本是一项不平凡的任务。除非你让 SDL_ttf 开发人员来解决这个问题,否则恐怕你唯一的选择是切换到不同的文本渲染引擎(比如 freetype 可能通过 pango 或类似的东西)。
  • 这就是我现在的位置。但是,我现在真的在寻找一种解决方法,看看是否有一些记录在案的方法可以让它正确呈现。
  • 是不是有点像这个? github.com/python-pillow/Pillow/issues/2255
  • 我不这么认为。

标签: python unicode pygame text-rendering devanagari


【解决方案1】:

我最终不得不针对我自己的情况求助于一个非常丑陋但可用的解决方法。我写了一个script-fu 插件,它接受一个文件名和一段文本作为参数。然后它写出文本并使用 gimp 将其保存为 png 文件。然后我的程序加载它并将 png 直接粘贴到表面上。

【讨论】:

    【解决方案2】:

    我认为是 SDL_ttf 问题(实际呈现文本的底层组件)。

    当我的 IDE 正确呈现字符串时

    SDL_TTF 程序不会:

    有代码:https://gist.github.com/ilario-pierbattista/be6b967b05fa2f1eb322f35988a33ad0

    我还在寻找解决方案

    【讨论】:

    • 这也是我的情况。
    • 这家伙也遇到了同样的问题,并为 SDL_ttf 发布了一个补丁。 Here 主帖,here bugzilla 页面,here 补丁。
    猜你喜欢
    • 2014-07-13
    • 2016-07-29
    • 1970-01-01
    • 2017-06-21
    • 2017-06-20
    相关资源
    最近更新 更多