draw.text()
に指定されたフォントとテキストに関して画像サイズを動的に拡大しようとしています。
元々の問題は、名前とユーザーが選択したフォントに基づいて署名画像を作成することです。
これが私のコードです
from PIL import (Image, ImageDraw, ImageFont,)
width=20
height=20
selected_font='simply_glomrous.ttf'
font_size=30
img = Image.new('RGBA', (width, height), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), "Adil Malik", (0,0,0), font)
img.save('signature.png')
しかし、私はまだ幅と高さで定義された同じ画像サイズを持っています。フォントとそのサイズに基づいて画像のサイズを動的に変更できますか?
注:この質問は このスタックオーバーフローの質問 の反対です
残念ながら、誰も私の質問に答えることができません。
基本的に、フォントサイズの設定中に固定幅と高さを設定することはできません。両方とも互いに依存しています。したがって、1つが増えると、2つ目も増えます。
だから私は別の解決策を考え出しました。フォントサイズを設定し、そのフォントサイズに基づいて幅と高さを設定しています。
from PIL import (Image, ImageDraw, ImageFont,)
name = 'Adil Malik'
selected_font='simply_glomrous.ttf'
font_size=30
font = ImageFont.truetype(selected_font, font_size)
font_size = font.getsize(name)
img = Image.new('RGBA', (font_size[0], font_size[0]), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), name, (0,0,0), font)
img.save('signature.png')
まず、スケールを正しくする必要があります。ポイントで指定されたフォントサイズから始めます。これは、1/72インチと定義されています。それらは「現実世界」のスケールです。描画している画像はピクセルで定義されています。ピクセルは、インチあたりのピクセル数の比率も定義した場合にのみ、インチ/ポイントとの関係を取得します。
したがって、問題についての考え方は逆になります。(ソースまたはターゲット画像からの)ピクセルから始めて、適切なフォントサイズを計算する必要があります。ユーザーにフォントサイズを選択してもらいたい場合は、関連するスケールの単位を変更するために、ターゲットDPI値を定義(または要求)する必要があります。
あなたが探している機能はDraw.textsize
入力としてテキスト文字列と描画オプションを受け取り、レンダリングされたテキストの幅と高さを返すメソッド。
http://effbot.org/imagingbook/imagedraw.htm#tag-ImageDraw.Draw.textsize
幅と高さがゼロの画像でDraw
クラスを使用してから、メソッドを呼び出して、レンダリングしようとしているテキストのサイズを決定できます。これらの寸法がわかったら、それに応じて画像のサイズを変更できます。例えば:
from PIL import ImageDraw, ImageFont, Image
# parameters
text = "My Name"
selected_font = "simply_glomrous.ttf"
font_size = 30
# get the size of the text
img = Image.new('RGBA', (0,0), (255, 255, 255, 0))
font = ImageFont.truetype(selected_font, font_size)
draw = ImageDraw.Draw(img)
text_size = draw.textsize(text, font)
# resize and draw
img = img.resize(text_size)
draw.text((0,0), text, (0,0,0), font)
img.save('signature.png')