Python 如何在PIL中压缩文本
我正在研究一个需要逐像素高精度的问题,因此我需要有能力以比PIL提供的更多的方式操纵文本。特别是在字距方面。有一项功能允许您禁用紧排,但不能控制紧排量Python 如何在PIL中压缩文本,python,python-imaging-library,Python,Python Imaging Library,我正在研究一个需要逐像素高精度的问题,因此我需要有能力以比PIL提供的更多的方式操纵文本。特别是在字距方面。有一项功能允许您禁用紧排,但不能控制紧排量 这个问题变得更具挑战性,因为PIL中的错误与精确测量文本大小有关。有很多关于这个问题的帖子,但最有用的信息是这里的一篇SO帖子和一篇博客文章,我的代码是供我自己使用的,但是如果有人有类似的问题,我相信它可以很容易地适应您自己的需要 我的主要职能是: def get_text_width(text_string, font): return
这个问题变得更具挑战性,因为PIL中的错误与精确测量文本大小有关。有很多关于这个问题的帖子,但最有用的信息是这里的一篇SO帖子和一篇博客文章,我的代码是供我自己使用的,但是如果有人有类似的问题,我相信它可以很容易地适应您自己的需要 我的主要职能是:
def get_text_width(text_string, font):
return font.getmask(text_string).getbbox()[2]
def kern(name, draw_object, y, space, font, fill):
chars = [char for char in name]
total_width = 0
for char in chars:
width_text = get_text_width(char, font)
total_width += (width_text + int(space))
__, height_text = draw_object.textsize(name, font)
__, offset_y = font.getoffset(name)
height_text += offset_y
width_adjuster = 0
for char in chars:
width_text = get_text_width(char, font)
top_left_x = (473 / 2 - total_width / 2) + width_adjuster
top_left_y = (40 / 2 - height_text / 2) + y
xy = top_left_x, top_left_y
width_adjuster += width_text + int(space)
print(f"char:{char},width_text:{width_text},xy:{xy},width_adjuster:{width_adjuster}")
draw_object.text(xy, char, font=font, fill=fill)
它在下面给出了一个很好的输出。然而,这并不完全准确。字母之间的像素数将因字体的不同而略有不同。我还没有找到一种标准化的方法,所以我只是接受了这样一个事实:当我在GUI中输入一个紧排值时,它只是相对于字体的标量,而不是像素数