Подтвердить что ты не робот

Как рисовать текст под углом, используя python PIL?

Использование Python Я хочу, чтобы иметь возможность рисовать текст под разными углами, используя PIL.

Например, представьте, что вы рисуете число вокруг лица часов. Число 3 будет выглядеть так, как ожидалось, тогда как 12 мы нарисуем вращение против часовой стрелки на 90 градусов.

Поэтому мне нужно иметь возможность рисовать много разных строк под разными углами.

4b9b3361

Ответ 1

Нарисуйте текст во временное пустое изображение, поверните его и вставьте в исходное изображение. Вы можете завершить шаги в функции. Удачи в определении точных координат для использования - мой холодный туманный мозг не справляется с этим прямо сейчас.

Эта демонстрация записывает желтый текст с наклонным изображением:

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

Ответ 2

Также полезно знать размер нашего текста в пикселях, прежде чем мы создадим объект Image. Я использовал такой код при рисовании графиков. Тогда у меня не возникло проблем, например. с выравниванием меток данных (изображение точно такое же, как текст).

(...)
img_main = Image.new("RGB", (200, 200))
font = ImageFont.load_default()

# Text to be rotated...
rotate_text = u'This text should be rotated.'

# Image for text to be rotated
img_txt = Image.new('L', font.getsize(rotate_text))
draw_txt = ImageDraw.Draw(img_txt)
draw_txt.text((0,0), rotate_text, font=font, fill=255)
t = img_value_axis.rotate(90, expand=1)

Остальная часть объединения двух изображений вместе уже описана на этой странице. Когда вы вращаетесь под "нерегулярным" углом, вам нужно немного улучшить этот код. Он работает на 90, 180, 270...

Ответ 3

Я не говорю, что это будет легко или что это решение обязательно будет идеально для вас, но посмотрите здесь документацию:

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

Чтобы сделать то, что вам действительно нужно, вам может понадобиться создать кучу отдельных правильно повернутых текстовых изображений, а затем составить их все вместе с некоторыми более причудливыми манипуляциями. И после всего этого все еще может показаться не очень здоровым. Я не уверен, как сглаживание и такое, например, обрабатывается, но это может быть не очень хорошо. Удачи, и если у кого будет более простой способ, мне было бы интересно также знать.

Ответ 4

Вот рабочая версия, вдохновленная ответом, но она работает без открытия или сохранения изображений.

Два изображения имеют цветной фон и альфа-канал, отличный от нуля, чтобы показать, что происходит. Изменение двух альфа-каналов от 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()