在PyCairo中可以改变字母间距吗?(或如何改变文本宽度而不影响高度)

3 投票
1 回答
1338 浏览
提问于 2025-04-18 16:09

我正在创建一个应用程序,使用Cairo来在图像上显示文本,还有其他一些功能。

有没有办法在不改变文本高度的情况下调整文本的宽度?我已经可以根据宽度来缩放字体大小了。

如果能管理一下字距和字形就更好了。看起来这个功能没有内置,但我想知道我需要用哪些组件来实现这个功能(或者任何只修改宽度的功能)。

1 个回答

2

Pango / PangoCairo

Pango 这个工具看起来提供了很多自定义的选项。

它的 标记格式 让你可以设置 letter_spacing,也就是字母之间的间距。

我对这个框架还不是很了解,但值得去深入研究一下。

自己写一个函数

你也可以创建一个函数,把文本拆分成一个个字符,显示每个字符,然后在显示每个字符后稍微向后移动一下上下文。可以像下面这样做:

# This is just an example. It could definitely use improvement.
def foo(cr, text, tracking): 
    # Normal tracking = 0. Negative spacing shrinks, positive expands.

    i = 0
    for c in text:
        x, y = cr.get_current_point()
        cr.show_text(c)
        counter += 1
        cr.move_to( x - i*tracking, y)

你还可以在自己定义的上下文子类中定义这个方法:

class myContext(Context):
    def foo(self, text, spacing):
        # replace every cr above with self
        

一旦你设置好这个方法,就可以简单地用 foo(cr, "bob", -3) 来显示一个更瘦的 bob。

你还可以在代码中使用 cr.text_extents(text) 来计算文本的大小和间距。根据我所知道的,从 Cairo 的上下文中获取字体大小并不是很简单。

撰写回答