Метод Pillow ImageDraw textbbox()
textbbox()Метод являетсяImageDrawочень полезная функция в модуле, используется для вычисления ограничивающей рамки, занимаемой заданным текстом при отрисовке на изображении.
textbbox()Метод фактически не рисует текст, а возвращает координаты прямоугольной области, которую будет занимать текст.
Синтаксис метода
textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0)
Сведения о параметрах
1. xy (обязательный)
- Тип: tuple (x, y)
- Описание: Задаёт начальную координатную позицию текста
- Примечание: На фактическое положение текста также влияет
anchorпараметра.
2. text (обязательный)
- Тип: string
- Описание: Текстовое содержимое, для которого нужно вычислить ограничивающую рамку
3. font (необязательный)
- Type:
ImageFont: object - Значение по умолчанию: None (использует шрифт по умолчанию)
- Описание: Указывает шрифт, используемый для текста
4. anchor (необязательно)
- Тип: string
- Значение по умолчанию: None (эквивалентно "la")
- Описание: Управляет выравниванием текста относительно координат xy
- Типичные значения:
- "la": выровнен по левому краю, по базовой линии (по умолчанию)
- "lt": выровнен по левому краю, по верхнему краю
- "ma": выровнен по центру, по базовой линии
- "mm": полностью центрирован (по горизонтали и вертикали)
5. spacing (необязательно)
- Тип: integer
- Значение по умолчанию: 4
- Описание: Межстрочный интервал для многострочного текста
6. align (необязательно)
- Тип: string
- Значение по умолчанию: "left"
- Описание: Выравнивание многострочного текста ("left", "center", "right")
7-10. Другие дополнительные параметры
direction,features,language,stroke_widthТакие параметры управляют дополнительными возможностями отрисовки текста; новичкам обычно не нужно осваивать их сразу.
Возвращаемое значение
textbboxМетод возвращает кортеж из 4 элементов(left, top, right, bottom), представляющий координаты ограничивающей рамки текста.
Примеры практического применения
Пример 1: Базовое использование
Пример
# Создать пустое изображение
image = Image.new('RGB', (400, 200), 'white')
draw = ImageDraw.Draw(image)
# Загрузить шрифт
font = ImageFont.truetype('arial.ttf', 24)
# Вычислить ограничивающую рамку текста
bbox = draw.textbbox((50, 50), "Hello Pillow!", font=font)
print("Text bounding box:", bbox) # Вывод: (left, top, right, bottom)
# Нарисовать ограничивающую рамку (визуализация)
draw.rectangle(bbox, outline='red')
# Собственно нарисовать текст
draw.text((50, 50), "Hello Pillow!", font=font, fill='black')
image.show()
Пример 2: Использование параметра anchor
Пример
# Координаты центральной точки
center_x, center_y = 200, 100
# Вычислить ограничивающую рамку текста с выравниванием по центру
bbox = draw.textbbox((center_x, center_y), "По центру", font=font, anchor="mm")
print("Ограничивающая рамка с выравниванием по центру:", bbox)
# Нарисовать центральную точку и ограничивающую рамку
draw.rectangle(bbox, outline='blue')
draw.ellipse([(center_x-2, center_y-2), (center_x+2, center_y+2)], fill='green')
# Нарисовать текст
draw.text((center_x, center_y), "По центру", font=font, fill='black', anchor="mm")
image.show()
Типичные сценарии применения
- Вычисление компоновки текста: Определить пространство, которое он занимает перед отрисовкой текста
- Автоматический перенос строк: Вычислить, как текст переносится в зависимости от доступной ширины
- Центрирование текста: Достичь точного центрирования путём комбинирования вычислений ограничивающей рамки
- Обнаружение коллизий: Избегайте перекрытия текста с другими элементами
Примечания
- Влияние шрифта: Разные шрифты могут возвращать очень разные размеры ограничивающего прямоугольника
- Многострочный текст: Для многострочного текста ограничивающий прямоугольник включает область всех строк
- Вопросы производительности: Частые вызовы могут влиять на производительность; рекомендуется кэшировать результаты
- Точность: Расчёт ограничивающего прямоугольника является приближённым; фактический рендеринг может немного отличаться
Сравнение с textsize
В старых версиях Pillow обычно используемыйtextsizeметод получения размера текста, но этот метод устарел.textbboxОн предоставляет более точную информацию (включая не только ширину и высоту, но и информацию о положении), что делает его предпочтительным методом для нового кода.
Пример
width, height = draw.textsize("Text", font=font)
# Новый метод (рекомендуется)
left, top, right, bottom = draw.textbbox((0, 0), "Text", font=font)
width = right - left
height = bottom - top
Итог
ImageDraw.textbboxЭтот метод — мощный и практичный инструмент в библиотеке Pillow, особенно подходящий для сценариев, требующих точного контроля компоновки текста. Понимая его параметры и возвращаемые значения, разработчики могут легко реализовать различные сложные требования к компоновке текста.