web-dev-qa-db-ja.com

PythonのPILを使用して斜めにテキストを描画するにはどうすればよいですか?

使用Python PILを使用してさまざまな角度でテキストを描画できるようにしたい。

たとえば、時計の文字盤の周りに数字を描いていたとします。 という数字は期待どおりに表示されますが、12は反時計回りに90度回転して描画されます。

したがって、さまざまな角度でさまざまな文字列を描画できる必要があります。

27
carrier

一時的な空白の画像にテキストを描画し、それを回転させてから、元の画像に貼り付けます。ステップを関数でまとめることができます。使用する正確な座標を理解するために頑張ってください-私の冷たい霧の脳は今それまでではありません。

このデモでは、画像の斜めに黄色のテキストを書き込みます。

# Demo to add rotated text to an image using PIL

import Image
import ImageFont, ImageDraw, ImageOps

im=Image.open("stormy100.jpg")

f = ImageFont.load_default()
txt=Image.new('L', (500,50))
d = ImageDraw.Draw(txt)
d.text( (0, 0), "Someplace Near Boulder",  font=f, fill=255)
w=txt.rotate(17.5,  expand=1)

im.paste( ImageOps.colorize(w, (0,0,0), (255,255,84)), (242,60),  w)
42
DarenW

これが簡単になるとか、このソリューションが必ずしもあなたにぴったりだと言っているわけではありませんが、こちらのドキュメントをご覧ください。

http://effbot.org/imagingbook/pil-index.htm

特に、Image、ImageDraw、およびImageFontモジュールに注意してください。

これがあなたを助けるための例です:


import Image
im = Image.new("RGB", (100, 100))
import ImageDraw
draw = ImageDraw.Draw(im)
draw.text((50, 50), "hey")
im.rotate(45).show()

あなたが本当にやりたいことをするために、あなたは別々の正しく回転されたテキスト画像の束を作りそしてそれからそれらをいくつかのより凝った操作で一緒に構成する必要があるかもしれません。そして結局のところ、それはまだ見栄えが良くないかもしれません。たとえば、アンチエイリアスなどがどのように処理されるかはわかりませんが、うまくいかない可能性があります。幸運を祈ります。もっと簡単な方法があれば、私も知りたいと思います。

3
user12861

これは答えに触発された動作バージョンですが、画像を開いたり保存したりしなくても動作します。

2つの画像には、何が起こっているかを示すために、ゼロとは異なる色付きの背景とアルファチャネルがあります。 2つのアルファチャンネルを92から0に変更すると、完全に透明になります。

from PIL import Image, ImageFont, ImageDraw

text = 'TEST'
font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 50)
width, height = font.getsize(text)

image1 = Image.new('RGBA', (200, 150), (0, 128, 0, 92))
draw1 = ImageDraw.Draw(image1)
draw1.text((0, 0), text=text, font=font, fill=(255, 128, 0))

image2 = Image.new('RGBA', (width, height), (0, 0, 128, 92))
draw2 = ImageDraw.Draw(image2)
draw2.text((0, 0), text=text, font=font, fill=(0, 255, 128))

image2 = image2.rotate(30, expand=1)

px, py = 10, 10
sx, sy = image2.size
image1.paste(image2, (px, py, px + sx, py + sy), image2)

image1.show()
3
stenci