Класс UImageRGBDrawPIL: рисование на UImageRGB
Класс UImageRGBDrawPIL предназначен для рисования на изображении UImageRGB средствами библиотеки Pillow. Инструкция импорта:
from unicross_image.uimagedraw import UImageRGBDrawPIL
Создание контекста рисования и получение результата
Прежде чем начинать рисовать необходимо создать контекст рисования, передав конструктору класса UImageRGBDrawPIL объект UImageRGB. Формат конструктора:
UImageRGBDrawPIL(<UImageRGB>)
Если библиотека Pillow недоступна или передано изображение не класса UImageRGB, а также в случае ошибки будет сгенерировано исключение ValueError.
После завершения рисования нужно вызвать метод get_uimagergb(), чтобы получить объект изображения обратно. Метод возвращает объект UImageRGB или значение None в случае ошибки.
Нарисуем круг с обводкой:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(500, 300, UColor("white"))
# Создание контекста рисования
draw = UImageRGBDrawPIL(img)
# Рисуем круг
x, y, radius = 250, 150, 100
draw.circle(x, y, radius, width_line=3)
# Получаем обратно изображение
img = draw.get_uimagergb()
img.save("test.png")
В результате мы получим красный круг с черной обводкой толщиной 3px.
Изменение характеристик заливки и обводки
По умолчанию при создании контекста рисования устанавливается красный цвет заливки. Изменить характеристики заливки позволяет метод set_fill(). Формат метода:
В качестве параметра указывается объект UColor (значение альфа-канала игнорируется). Если нужно нарисовать фигуру без заливки, то следует передать значение None. Метод ничего не возвращает.
По умолчанию при создании контекста рисования устанавливается черный цвет обводки. Изменить характеристики обводки позволяет метод set_stroke(). Формат метода:
В качестве параметра указывается объект UColor (значение альфа-канала игнорируется). Если нужно нарисовать фигуру без обводки, то следует передать значение None. Метод ничего не возвращает.
После установки характеристик заливки и обводки все последующие операции рисования будут использовать эти значения.
Нарисуем желтый круг с красной обводкой:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(500, 300, UColor("white"))
# Создание контекста рисования
draw = UImageRGBDrawPIL(img)
# Цвет заливки
draw.set_fill(UColor("yellow"))
# Цвет обводки
draw.set_stroke(UColor("red"))
# Рисуем круг
x, y, radius = 250, 150, 100
draw.circle(x, y, radius, width_line=3)
# Получаем обратно изображение
img = draw.get_uimagergb()
img.save("test.png")
Нарисуем два круга. Первый круг будет желтого цвета без обводки. Второй круг будет содержать только красную обводку толщиной 3px без заливки:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
# Цвет заливки
draw.set_fill(UColor("yellow"))
# Цвет обводки (без обводки)
draw.set_stroke(None)
# Рисуем желтый круг без обводки
x, y, radius = 60, 60, 50
draw.circle(x, y, radius)
# Цвет заливки (без заливки)
draw.set_fill(None)
# Цвет обводки
draw.set_stroke(UColor("red"))
# Рисуем круг с красной обводкой без заливки
x, y, radius = 200, 60, 50
draw.circle(x, y, radius, width_line=3)
img = draw.get_uimagergb()
img.save("test.png")
Рисование с помощью методов из библиотеки Pillow
С помощью метода get_imagedraw() можно получить контекст рисования ImageDraw из библиотеки Pillow и нарисовать что-либо с помощью методов этой библиотеки. Нарисуем желтый круг с красной обводкой:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
# Получаем контекст рисования ImageDraw
draw_pil = draw.get_imagedraw()
# Рисуем круг с помощью Pillow
draw_pil.ellipse((50, 50, 150, 150), fill=(255, 255, 0),
outline=(255, 0, 0), width=3)
img = draw.get_uimagergb()
img.save("test.png")
Рисование точки
Нарисовать точку позволяет метод point(). Формат метода:
В первом параметре указывается координата по оси X, а во втором — координата по оси Y. При рисовании точки используются характеристики заливки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Нарисуем красную линию из нескольких точек:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("white"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
for n in range(5, 31):
draw.point(n, 5)
img = draw.get_uimagergb()
img.save("test.png")
Настоятельно не рекомендую использовать метод point() для рисования большого числа точек. Внутри метода выполняется слишком много лишних действий. которые негативно отразятся на скорости выполнения. Гораздо более эффективно рисовать точки с помощью Pillow напрямую:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("white"))
draw = UImageRGBDrawPIL(img)
# Получаем контекст рисования ImageDraw
draw_pil = draw.get_imagedraw()
# Рисуем с помощью Pillow
for n in range(5, 31):
draw_pil.point( (n, 5), fill=(255, 0, 0) )
img = draw.get_uimagergb()
img.save("test.png")
Рисование линии
Нарисовать линию позволяет метод line(). Формат метода:
line(x1, y1, x2, y2, width_line=1)
В первых двух параметрах указываются координаты начала линии. Третий и четвертый параметры задают координаты конца линии. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании линии используются характеристики заливки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Нарисуем красную линию и зеленую линию толщиной 3px:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("white"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.line(10, 10, 190, 10)
draw.set_fill(UColor("green"))
draw.line(10, 40, 190, 40, width_line=3)
img = draw.get_uimagergb()
img.save("test.png")
Рисование прямоугольника
Нарисовать прямоугольник позволяет метод rect(). Формат метода:
rect(x, y, width, height, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника. Третий параметр позволяет задать ширину, а четвертый параметр — высоту прямоугольника. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании прямоугольника используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False.
Нарисуем четыре прямоугольника. Первые два прямоугольника с рамкой и заливкой, третий — только с заливкой, а четвертый — только с рамкой:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
draw.rect(10, 10, 100, 50)
draw.rect(10, 80, 100, 50, width_line=5)
draw.set_stroke(None)
draw.rect(10, 140, 100, 50)
draw.set_fill(None)
draw.set_stroke(UColor("black"))
draw.rect(120, 10, 50, 100, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Рисование прямоугольной рамки
Нарисовать прямоугольную рамку позволяет метод rect_stroke(). Формат метода:
rect_stroke(<URect>, width_line=1, expand=False)
В первом параметре указываются координаты левого верхнего угла и размеры рамки с помощью объекта URect. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. Если в параметре expand указано значение True, то рамка рисуется снаружи прямоугольной области. По умолчанию рамка отображается внутри прямоугольной области. При рисовании рамки используются только характеристики обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.uhelper import URect
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_stroke(UColor("black"))
draw.rect_stroke(URect(50, 50, 100, 50),
width_line=5, expand=False)
draw.set_stroke(UColor("green"))
draw.rect_stroke(URect(50, 110, 100, 50),
width_line=5, expand=True)
img = draw.get_uimagergb()
img.save("test.png")
Рисование прямоугольника со скругленными углами
Нарисовать прямоугольник со скругленными углами позволяет метод rounded_rect(). Формат метода:
rounded_rect(x, y, width, height, radius=0, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника. Третий параметр задает ширину, а четвертый параметр — высоту прямоугольника. Параметр radius позволяет указать радиус скругления углов. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании прямоугольника используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False.
Нарисуем четыре прямоугольника. Первые два прямоугольника с рамкой и заливкой, третий — только с заливкой, а четвертый — только с рамкой:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(300, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
draw.rounded_rect(10, 10, 100, 50, radius=45)
draw.rounded_rect(10, 80, 100, 50, radius=45, width_line=5)
draw.set_stroke(None)
draw.rounded_rect(10, 140, 100, 50, radius=45)
draw.set_fill(None)
draw.set_stroke(UColor("black"))
draw.rounded_rect(120, 10, 50, 100, radius=45, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Рисование многоугольника
Нарисовать многоугольник позволяет метод polygon(). Формат метода:
polygon(<Список>, width_line=1)
В параметре <Список> указываются координаты трех и более точек в виде списка. Указанные точки соединяются линиями. Кроме того, проводится прямая линия между первой и последней точками. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании многоугольника используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False.
Нарисуем треугольник с обводкой и заливкой и шестиугольник без обводки:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
# Треугольник с обводкой и заливкой
draw.polygon([50, 50, 150, 150, 50, 150], width_line=3)
draw.set_stroke(None)
# Шестиугольник без обводки
draw.polygon([200, 200, 250, 200, 275, 250, 250, 300,
200, 300, 175, 250])
img = draw.get_uimagergb()
img.save("test.png")
Рисование эллипса
Нарисовать эллипс позволяет метод ellipse(). Формат метода:
ellipse(x, y, width, height, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника, в который необходимо вписать эллипс. Третий параметр позволяет задать ширину, а четвертый параметр — высоту прямоугольника. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании эллипса используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
# С заливкой и обводкой
draw.ellipse(10, 10, 200, 100, width_line=3)
draw.set_stroke(None)
# Только с заливкой
draw.ellipse(10, 150, 200, 100)
draw.set_fill(None)
draw.set_stroke(UColor("green"))
# Только с обводкой
draw.ellipse(220, 40, 100, 200, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Рисование круга
Нарисовать круг позволяет метод circle(). Формат метода:
circle(x, y, radius, width_line=1)
В первых двух параметрах указываются координаты центра круга. Третий параметр позволяет задать радиус круга. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании круга используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 200, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
# С заливкой и обводкой
draw.circle(60, 100, 50, width_line=3)
draw.set_stroke(None)
# Только с заливкой
draw.circle(200, 100, 50)
draw.set_fill(None)
draw.set_stroke(UColor("green"))
# Только с обводкой
draw.circle(340, 100, 50, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Рисование дуги
Нарисовать дугу позволяет метод arc(). Формат метода:
arc(x, y, width, height, start, end, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника, в который необходимо вписать окружность. Третий параметр позволяет задать ширину, а четвертый параметр — высоту прямоугольника. Параметры start и end задают начальный и конечный угол, между которыми будет отображена дуга. Угол, равный 0, расположен в крайней правой точке. Увеличение производится по часовой стрелке от 0 до 360. Линия рисуется по часовой стрелке. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании дуги используются характеристики заливки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("gray"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.arc(60, 60, 280, 280, start=140, end=0, width_line=3)
img = draw.get_uimagergb()
img.save("test.png")
Рисование замкнутой дуги
Нарисовать замкнутую дугу (крайние точки дуги соединяются прямой линией) позволяет метод chord(). Формат метода:
chord(x, y, width, height, start, end, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника, в который необходимо вписать окружность. Третий параметр позволяет задать ширину, а четвертый параметр — высоту прямоугольника. Параметры start и end задают начальный и конечный угол, между которыми будет отображена дуга. Угол, равный 0, расположен в крайней правой точке. Увеличение производится по часовой стрелке от 0 до 360. Линия рисуется по часовой стрелке. Крайние точки дуги соединяются прямой линией. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании замкнутой дуги используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
# С заливкой и обводкой
draw.chord(50, 50, 300, 300, start=180, end=0, width_line=3)
draw.set_fill(UColor("blue"))
draw.set_stroke(None)
# Только с заливкой
draw.chord(50, 50, 300, 300, start=0, end=90)
draw.set_fill(None)
draw.set_stroke(UColor("green"))
# Только с обводкой
draw.chord(50, 50, 300, 300, start=90, end=180, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Рисование сектора
Нарисовать сектор (крайние точки дуги соединяются с центром окружности) позволяет метод pieslice(). Формат метода:
pieslice(self, x, y, width, height, start, end, width_line=1)
В первых двух параметрах указываются координаты левого верхнего угла прямоугольника, в который необходимо вписать окружность. Третий параметр позволяет задать ширину, а четвертый параметр — высоту прямоугольника. Параметры start и end задают начальный и конечный угол, между которыми будет отображена дуга. Угол, равный 0, расположен в крайней правой точке. Увеличение производится по часовой стрелке от 0 до 360. Линия рисуется по часовой стрелке. Крайние точки дуги соединяются с центром окружности, образуя тем самым замкнутый сектор. Параметр width_line задает толщину линии. По умолчанию рисуется линия толщиной 1px. При рисовании сектора используются характеристики заливки и обводки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
draw.set_stroke(UColor("black"))
# С заливкой и обводкой
draw.pieslice(50, 50, 300, 300,
start=180, end=320, width_line=3)
draw.set_fill(UColor("blue"))
draw.set_stroke(None)
# Только с заливкой
draw.pieslice(50, 50, 300, 300, start=0, end=80)
draw.set_fill(None)
draw.set_stroke(UColor("green"))
# Только с обводкой
draw.pieslice(50, 50, 300, 300, start=90, end=160, width_line=5)
img = draw.get_uimagergb()
img.save("test.png")
Вывод текста на изображение
Вывести текст на изображение позволяет метод text(). Формат метода:
text(x, y, txt, font, stroke_width=0)
В первых двух параметрах указывается координаты левого верхнего угла прямоугольной области, в которую вписан текст. В третьем параметре задается текст надписи. Параметр font определяет характеристики шрифта в виде объекта ImageFont из библиотеки Pillow. Параметр stroke_width позволяет указать толщину линии обводки. При выводе текста используются характеристики заливки и обводки (если значение параметра stroke_width больше 0). Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UFont, UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
draw.set_fill(UColor("red"))
font = UFont.create_pil_font()
draw.text(10, 10, "Привет мир", font)
font = UFont.create_pil_font(r"C:\WINDOWS\Fonts\verdana.ttf", 24)
draw.set_fill(UColor("green"))
draw.text(10, 40, "Привет мир", font)
font = UFont.create_pil_font(r"C:\WINDOWS\Fonts\verdana.ttf", 60)
draw.set_fill(UColor("yellow"))
draw.set_stroke(UColor("black"))
# С заливкой и обводкой
draw.text(10, 100, "Привет мир", font, stroke_width=2)
img = draw.get_uimagergb()
img.save("test.png")
Получить размеры прямоугольника, в который вписывается надпись, позволяет метод text_box(). Формат метода:
text_box(x, y, txt, font, stroke_width=0)
В первых двух параметрах указывается координаты левого верхнего угла прямоугольной области, в которую вписан текст. В третьем параметре задается текст надписи. Параметр font определяет характеристики шрифта в виде объекта ImageFont из библиотеки Pillow. Параметр stroke_width позволяет указать толщину линии обводки. Если операция выполнена успешно метод вернет кортеж из 4-х элементов (left, top, right, bottom), а в случае ошибки — значение None. Пример:
from unicross_image.uhelper import URect
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UFont, UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
font = UFont.create_pil_font(r"C:\WINDOWS\Fonts\verdana.ttf", 24)
draw.set_fill(UColor("green"))
txt = "Привет мир"
box = draw.text_box(10, 10, txt, font)
if box is not None:
left, top, right, bottom = box
print(left, top, right, bottom)
# 10 17 153 40
r = URect.coordinates(left, top, right, bottom)
width, height = r.get_size()
print(width, height)
# 143 23
draw.rect_stroke(r, width_line=1, expand=True)
draw.text(10, 10, txt, font)
img = draw.get_uimagergb()
img.save("test.png")
Вывод многострочного текста на изображение
Вывести многострочный текст на изображение позволяет метод multiline_text(). Формат метода:
multiline_text(x, y, txt, font, spacing=4, align="left")
В первых двух параметрах указывается координаты левого верхнего угла прямоугольной области, в которую вписан текст. В третьем параметре задается многострочный текст. Параметр font определяет характеристики шрифта в виде объекта ImageFont из библиотеки Pillow. Параметр spacing позволяет указать междустрочный интервал. Выравнивание текста задается с помощью параметра align. Допустимы значения "left", "right" или "center". При выводе многострочного текста используются характеристики заливки. Если операция выполнена успешно метод вернет значение True, а в случае ошибки — значение False. Пример:
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UFont, UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
font = UFont.create_pil_font(r"C:\WINDOWS\Fonts\verdana.ttf", 24)
draw.set_fill(UColor("red"))
draw.multiline_text(10, 10, "Привет\nмир", font)
draw.set_fill(UColor("green"))
draw.multiline_text(10, 100, "Привет\nмир", font, align="right")
draw.set_fill(UColor("black"))
draw.multiline_text(10, 200, "Привет\nмир", font,
spacing=10, align="center")
img = draw.get_uimagergb()
img.save("test.png")
Получить размеры прямоугольника, в который вписывается многострочный текст, позволяет метод multiline_text_box(). Формат метода:
multiline_text_box(x, y, txt, font, spacing=4, align="left")
В первых двух параметрах указывается координаты левого верхнего угла прямоугольной области, в которую вписан текст. В третьем параметре задается многострочный текст. Параметр font определяет характеристики шрифта в виде объекта ImageFont из библиотеки Pillow. Параметр spacing позволяет указать междустрочный интервал. Выравнивание текста задается с помощью параметра align. Допустимы значения "left", "right" или "center". При выводе многострочного текста используются характеристики заливки. Если операция выполнена успешно метод вернет кортеж из 4-х элементов (left, top, right, bottom), а в случае ошибки — значение None. Пример:
from unicross_image.uhelper import URect
from unicross_image.ucolor import UColor
from unicross_image.uimagergb import UImageRGB
from unicross_image.uimagedraw import UFont, UImageRGBDrawPIL
img = UImageRGB(400, 400, UColor("white"))
draw = UImageRGBDrawPIL(img)
font = UFont.create_pil_font(r"C:\WINDOWS\Fonts\verdana.ttf", 24)
draw.set_fill(UColor("green"))
txt = "Привет\nмир"
box = draw.multiline_text_box(10, 10, txt, font,
spacing=10, align="center")
if box is not None:
left, top, right, bottom = box
print(left, top, right, bottom)
# 10.0 17 98.0 75
r = URect.coordinates(left, top, right, bottom)
width, height = r.get_size()
print(width, height)
# 88 58
draw.rect_stroke(r, width_line=1, expand=True)
draw.multiline_text(10, 10, txt, font, spacing=10, align="center")
img = draw.get_uimagergb()
img.save("test.png")
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage