web-dev-qa-db-ja.com

PIL画像のサイズに関連してテキストサイズを拡大縮小する方法

テキストを動的に拡大縮小して、さまざまな既知の寸法の画像に配置しようとしています。テキストは透かしとして適用されます。画像の寸法に関連してテキストを拡大縮小する方法はありますか?テキストが十分に見えるようにするために、テキストが表面積全体を占めることを要求しません。 LinuxではPython Imaging Library version 1.1.7。を使用しています。

テキストのサイズと画像のサイズの比率を、たとえばサイズの1/10程度に設定できるようにしたいと思います。

私はサイズを変更するためにフォントサイズ属性を見てきましたが、それを拡大縮小するアルゴリズムを作成することができませんでした。より良い方法があるかどうか私は思っています。

これを達成する方法についてのアイデアはありますか?

ありがとう

31
Shpongle

フィットが見つかるまでフォントサイズを増やすだけです。 font.getsize()は、レンダリングされたテキストの大きさを通知する関数です。

_import ImageFont, ImageDraw, Image

image = Image.open('hsvwheel.png')
draw = ImageDraw.Draw(image)
txt = "Hello World"
fontsize = 1  # starting font size

# portion of image width you want text width to be
img_fraction = 0.50

font = ImageFont.truetype("arial.ttf", fontsize)
while font.getsize(txt)[0] < img_fraction*image.size[0]:
    # iterate until the text size is just larger than the criteria
    fontsize += 1
    font = ImageFont.truetype("arial.ttf", fontsize)

# optionally de-increment to be sure it is less than criteria
fontsize -= 1
font = ImageFont.truetype("arial.ttf", fontsize)

print 'final font size',fontsize
draw.text((10, 25), txt, font=font) # put the text on the image
image.save('hsvwheel_txt.png') # save it
_

これが十分に効率的でない場合は、ルート検索スキームを実装できますが、font.getsize()関数は、他の画像編集プロセスに比べて小さなポテトだと思います。

56
Paul

一般に、フォントのサイズを変更しても、フォントのサイズが直線的に変化することはありません。

Non-linear Scaling

現在、これはソフトウェア、フォントなどに依存することがよくあります。この例は Typophile から取られ、LaTex + Computer Modernフォントを使用しています。ご覧のとおり、これは正確には線形スケーリングではありません。したがって、ノンリニアフォントスケーリングで問題が発生している場合は、どのように解決すればよいかわかりませんが、提案の1つは多分それです。

  1. フォントを必要なサイズに近づけてレンダリングし、通常の画像スケーリングアルゴリズムを介してフォントを拡大/縮小します...
  2. ちょうどそれが線形スケーリングではないことを受け入れ、画像サイズと一致するフォントの最も近いポイントサイズを選択するある種のテーブル/アルゴリズムを作成してみてください。
7
Pharaun