17

さまざまなサイズの画像に配置するためにテキストを動的に拡大/縮小しようとしています。テキストは透かしとして適用されます。イメージの寸法に関連してテキストを拡大縮小する方法はありますか?私はテキストが全体の表面積を占める必要はありません。十分に見えるようにするだけで簡単に識別でき、削除するのは難しいです。私はPython Imaging Libraryバージョン1.1.7を使用しています。 Linuxで。PIL画像のサイズに合わせてテキストサイズを調整する方法

イメージのサイズに対するテキストのサイズの比、たとえば1/10のサイズなどを設定できるようにしたいと考えています。

私はサイズを変更するためにフォントサイズ属性を見てきましたが、私はそれを拡大するアルゴリズムを作ることに幸運を持っていませんでした。もっと良い方法があるのだろうかと思っています。

私はこれをどのように達成することができますか?

おかげで一般的に

答えて

37

あなたがフィット感を見つけるまで、単にフォントサイズを増やすことができます。 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 

これがあなたのために十分に効率的ではない場合は、root-発見スキームを実装することができますが、私はfont.getsize()機能がお使いの画像編集プロセスの残りの部分に比べて小さいポテトであることを推測しています。

+4

こんにちはポール、それはトリックでした。助けてくれてありがとう – Shpongle

5

あなたはそのフォントのサイズで直線的な変化であることを行っていないサイズのフォントを変更します。

Non-linear Scaling

さて、これは多くの場合など、フォント、ソフトウェアに依存して...この例ではTypophileから採取したラテックス+コンピュータの近代フォントを使用しました。ご覧の通り、直線的なスケーリングではありません。ですから、非線形フォントのスケーリングに問題がある場合、それを解決する方法がわかりませんが、1つの提案があるかもしれません。

  1. 希望のサイズに密接としてフォントをレンダリングし、それをスケールアップ/ダウン通常のイメージスケーリングアルゴリズムを経由して...
  2. はちょうどそれが正確にリニアスケーリングされないことを受け入れ、作成しようフォントに最も近いポイントサイズを選択して画像サイズと一致させる何らかの種類のテーブル/アルゴリズム。
+0

返事をありがとう、ポールが提案した方法はそれを解決しました。とにかくおかげで。 – Shpongle

+0

イメージを見る私の最初の考えは、「テキストで線の高さを拡大しないと、線のように見えません。しかし、行の長さを比較すると、6ptフォントのレンダリングされた長さは12ptの半分以上であり、5ptは10ptの半分以上であることがわかります。 – Ian

関連する問題