Примерно приблизительная ширина строки текста в Python? [закрытый]
Как можно, используя Python, приблизить ширину шрифта данной строки текста?
Я ищу функцию с прототипом, похожим на:
def getApproximateFontWidth(the_string, font_name="Arial", font_size=12):
return ... picas or pixels or something similar ...
Я не ищу ничего очень строгого, аппроксимация будет в порядке.
Мотивация для этого заключается в том, что я генерирую усеченную строку в бэкэнде моего веб-приложения и отправляю ее на внешний интерфейс для отображения. В большинстве случаев строки пишутся в нижнем регистре, но иногда строки пишутся заглавными буквами., делая их очень широкими. Если струна не будет должным образом затянута, она будет выглядеть уродливо. Я хотел бы знать, насколько усечь строки, основываясь на их приблизительной ширине. Если он уменьшен на 10% ,это не имеет большого значения, это косметическая особенность.
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, а затем определить ширину полученного изображения.
Я использовал библиотеку, которая делает это, однако она требует pygame: http://inside.catlin.edu/site/compsci/ics/python/graphics.py Посмотрите под sizeString
Comments