Примерно приблизительная ширина строки текста в Python? [закрытый]



Как можно, используя Python, приблизить ширину шрифта данной строки текста?



Я ищу функцию с прототипом, похожим на:



def getApproximateFontWidth(the_string, font_name="Arial", font_size=12):
return ... picas or pixels or something similar ...


Я не ищу ничего очень строгого, аппроксимация будет в порядке.



Мотивация для этого заключается в том, что я генерирую усеченную строку в бэкэнде моего веб-приложения и отправляю ее на внешний интерфейс для отображения. В большинстве случаев строки пишутся в нижнем регистре, но иногда строки пишутся заглавными буквами., делая их очень широкими. Если струна не будет должным образом затянута, она будет выглядеть уродливо. Я хотел бы знать, насколько усечь строки, основываясь на их приблизительной ширине. Если он уменьшен на 10% ,это не имеет большого значения, это косметическая особенность.

545   3  

3 ответов:

Ниже приведено мое простое решение, которое дает вам порядка 80% точности, идеально подходит для моих целей. Он работает только для Arial и предполагает шрифт 12 pt, но, вероятно, пропорционален и другим шрифтам.

def getApproximateArialStringWidth(st):
    size = 0 # in milinches
    for s in st:
        if s in 'lij|\' ': size += 37
        elif s in '![]fI.,:;/\\t': size += 50
        elif s in '`-(){}r"': size += 60
        elif s in '*^zcsJkvxy': size += 85
        elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
        elif s in 'BSPEAKVXY&UwNRCHD': size += 112
        elif s in 'QGOMm%W@': size += 135
        else: size += 50
    return size * 6 / 1000.0 # Convert to picas

И если вы хотите усечь строку, вот она:

def truncateToApproximateArialWidth(st, width):
    size = 0 # 1000 = 1 inch
    width = width * 1000 / 6 # Convert from picas to miliinches
    for i, s in enumerate(st):
        if s in 'lij|\' ': size += 37
        elif s in '![]fI.,:;/\\t': size += 50
        elif s in '`-(){}r"': size += 60
        elif s in '*^zcsJkvxy': size += 85
        elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
        elif s in 'BSPEAKVXY&UwNRCHD': size += 112
        elif s in 'QGOMm%W@': size += 135
        else: size += 50
        if size >= width:
            return st[:i+1]
    return st

Затем следующее:

>> width = 15
>> print truncateToApproxArialWidth("the quick brown fox jumps over the lazy dog", width) 
the quick brown fox jumps over the
>> print truncateToApproxArialWidth("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG", width) 
THE QUICK BROWN FOX JUMPS

При визуализации эти строки имеют примерно одинаковую ширину:

Быстрая бурая лиса перепрыгивает через

БЫСТРАЯ БУРАЯ ЛИСА ПРЫГАЕТ

Вы можете отрисовать изображение с текстом с помощью PIL, а затем определить ширину полученного изображения.

Http://effbot.org/imagingbook/imagefont.htm

Я использовал библиотеку, которая делает это, однако она требует pygame: http://inside.catlin.edu/site/compsci/ics/python/graphics.py Посмотрите под sizeString

Comments

    Ничего не найдено.