Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Вывод текста в библиотеке pillow
При работе с текстом, который вы собираетесь выводить в графическом изображении, следует начинать с выбора шрифта. Для этого используется класс ImageFont. Для работы же уже непосредственно с текстом используются методы класса ImageDraw.
- ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False) — вывод строки в заданном положении. xy - координата начала текста, text - текст, fill - цвет текста, font - шрифт, anchor - выравнивание относительно точки xy, spacing - количество пикселей между строками (в методе multiline_text), align - выравнивание линий в методе multiline_text, direction - направление вывода текста ('rtl', ltr', 'ttb'), features - список функций шрифта OpenType, language - язык текста, stroke_width - ширина обводки текста, embedded_color - использовать ли глифы цвета.
- ImageDraw.multiline_text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False) — вывод многострочного текста.
Пример программы
#!/usr/bin/python3
from PIL import Image, ImageFont, ImageDraw
image = Image.new("RGB", (400, 400), (0, 0, 0))
d = ImageDraw.Draw(image)
fnt = ImageFont.truetype("FreeSans.ttf", size=50)
d.text((10, 10), "Доброго дня!", font=fnt)
fnt = ImageFont.truetype("FreeMono.ttf", size=50)
d.multiline_text((10, 100), "Как вам этот\nтекст?", font=fnt, fill=(50, 200, 200))
image.save('im.jpg')
Результат работы программы см. на рисунке 1
Как видим, для использования нужного шрифта нам понадобился класс ImageFont, с помощью которого мы создали объект - шрифт, который мы потом использовали при выводе текста.
- ImageDraw.textsize(text, font=None, spacing=4, direction=None, features=None, language=None, stroke_width=0) — возвращает длину текста в пикселях.
- mageDraw.multiline_textsize(text, font=None, spacing=4, direction=None, features=None, language=None, stroke_width=0) — возвращает длину и высоту текста в пикселях.
- ImageDraw.textlength(text, font=None, direction=None, features=None, language=None, embedded_color=False) — возвращает ширина по горизонтали и высота по вертикали (в пикселях с точностью 1/64) заданного текста text при отображении шрифтом font с заданным направлением direction.
- ImageDraw.textbbox(xy, text, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, embedded_color=False) — возвращает ограничивающую рамку (left, top, right, bottom) текста.
- ImageDraw.multiline_textbbox(xy, text, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, embedded_color=False) — возвращает ограничивающую рамку (left, top, right, bottom) многострочного текста.
Пример получения размеров текста
#!/usr/bin/python3
from PIL import Image, ImageFont, ImageDraw
image = Image.new("RGB", (400, 400), (0, 0, 0))
d = ImageDraw.Draw(image)
xy = (30, 100)
txt = "Как вам этот\nтекст?"
fnt = ImageFont.truetype("FreeSans.ttf", size=50)
d.multiline_text(xy, txt, font=fnt, fill=(50, 50, 255))
box = d.multiline_textbbox(xy, txt, font=fnt)
d.rectangle(box, outline=(0, 255, 255), width=3)
image.save('im2.jpg')
Результат работы программы см. на рисунке 2
Замечание важное
Не все возможности описанных выше методов будут корректно работать. В некоторых случаях потребуется библиотека libraqm. Опять же кое-что будет зависеть от типов шрифтов. Так важно практиковаться.
Ну ещё один пример. Понятно, что текст можно выводить горизонтально или вертикально (если есть библиотека libraqm), а как повернуть его на произвольный угол. В этом нет ничего сложного, у нас уже есть весь инструментарий.
#!/usr/bin/python3
from PIL import Image, ImageFont, ImageDraw
image = Image.new("RGB", (600, 400), (0, 0, 0))
d = ImageDraw.Draw(image)
xy = (30, 100)
txt = "Как вам этот текст?"
fnt = ImageFont.truetype("FreeSans.ttf", size=50)
d.text(xy, txt, font=fnt, fill=(50, 50, 255))
box = d.textbbox(xy, txt, font=fnt)
# вырежем только надпись
image1=image.crop(box)
# повернуть кусочек с надписью
image1 = image1.rotate(25, expand=True)
# создать новое пустое изображение
image2 = Image.new("RGB", (600, 400), (0, 0, 0))
# вставить изображение с повёрнутой надписью
image2.paste(image1, (100, 100))
image2.save('im4.jpg')
Результат работы показан на рисунке 3
Ну, пока всё!
Пишите свои предложения и замечания и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.