在PyCairo中可以改变字母间距吗?(或如何改变文本宽度而不影响高度)
我正在创建一个应用程序,使用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 的上下文中获取字体大小并不是很简单。