Python 如何在PIL中压缩文本

Python 如何在PIL中压缩文本,python,python-imaging-library,Python,Python Imaging Library,我正在研究一个需要逐像素高精度的问题,因此我需要有能力以比PIL提供的更多的方式操纵文本。特别是在字距方面。有一项功能允许您禁用紧排,但不能控制紧排量 这个问题变得更具挑战性,因为PIL中的错误与精确测量文本大小有关。有很多关于这个问题的帖子,但最有用的信息是这里的一篇SO帖子和一篇博客文章,我的代码是供我自己使用的,但是如果有人有类似的问题,我相信它可以很容易地适应您自己的需要 我的主要职能是: def get_text_width(text_string, font): return

我正在研究一个需要逐像素高精度的问题,因此我需要有能力以比PIL提供的更多的方式操纵文本。特别是在字距方面。有一项功能允许您禁用紧排,但不能控制紧排量


这个问题变得更具挑战性,因为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中输入一个紧排值时,它只是相对于字体的标量,而不是像素数