6

Python を使用して、与えられたテキスト文字列のフォント幅をどのように近似しますか?

次のようなプロトタイプを持つ関数を探しています。

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

私は非常に厳密なものを探しているわけではありません。近似値で問題ありません。

これの動機は、webapp のバックエンドで切り捨てられた文字列を生成し、それをフロントエンドに送信して表示することです。ほとんどの場合、文字列は小文字ですが、文字列がすべて大文字である場合があり、非常に幅が広​​くなります。文字列が適切に切り詰められていないと、見栄えが悪くなります。おおよその幅に基づいて、文字列をどれだけ切り詰めるか知りたいです。10% ずれていても大したことではありません。これは表面的な機能です。

4

3 に答える 3

12

以下は私の簡単な解決策です。これにより、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

レンダリングすると、これらの文字列はほぼ同じ幅になります。

速い茶色のキツネが飛び越えます

クイック・ブラウン・フォックス・ジャンプ

于 2013-04-15T05:07:48.577 に答える
4

PIL を使用してテキストを含む画像をレンダリングし、結果の画像の幅を決定できます。

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

于 2013-04-15T04:44:03.490 に答える
1

これを行うライブラリを使用しましたが、pygame が必要です: http://inside.catlin.edu/site/compsci/ics/python/graphics.py sizeString の下を見てください

于 2013-04-15T04:47:58.097 に答える