web-dev-qa-db-ja.com

PIL画像に描かれたテキストに関連して画像を拡大縮小する方法

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')

しかし、私はまだ幅と高さで定義された同じ画像サイズを持っています。フォントとそのサイズに基づいて画像のサイズを動的に変更できますか?

:この質問は このスタックオーバーフローの質問 の反対です

16
Adil Malik

残念ながら、誰も私の質問に答えることができません。

基本的に、フォントサイズの設定中に固定幅と高さを設定することはできません。両方とも互いに依存しています。したがって、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')
13
Adil Malik

OpenCVとnumpyを使用できる場合は、

  1. GetTextSizeを使用してテキストサイズを確認します
  2. Numpy.ones((height、width、3)、np.uint8)* 255を使用して白い画像を作成します

  3. PutTextを使用して画像にテキストを追加し、

  4. Imwriteを使用して画像を保存します。

参考のために ここ および ここ を参照してください。

3
Yohai De

まず、スケールを正しくする必要があります。ポイントで指定されたフォントサイズから始めます。これは、1/72インチと定義されています。それらは「現実世界」のスケールです。描画している画像はピクセルで定義されています。ピクセルは、インチあたりのピクセル数の比率も定義した場合にのみ、インチ/ポイントとの関係を取得します。

したがって、問題についての考え方は逆になります。(ソースまたはターゲット画像からの)ピクセルから始めて、適切なフォントサイズを計算する必要があります。ユーザーにフォントサイズを選択してもらいたい場合は、関連するスケールの単位を変更するために、ターゲットDPI値を定義(または要求)する必要があります。

2
user2722968

あなたが探している機能は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')
2
Jonny Morrill