Метод 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: Базовое использование

Пример

from PIL import Image, ImageDraw, ImageFont

# Создать пустое изображение
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

Пример

# Продолжаем использовать объекты image и draw из предыдущего примера

# Координаты центральной точки
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()

Типичные сценарии применения

  1. Вычисление компоновки текста: Определить пространство, которое он занимает перед отрисовкой текста
  2. Автоматический перенос строк: Вычислить, как текст переносится в зависимости от доступной ширины
  3. Центрирование текста: Достичь точного центрирования путём комбинирования вычислений ограничивающей рамки
  4. Обнаружение коллизий: Избегайте перекрытия текста с другими элементами

Примечания

  1. Влияние шрифта: Разные шрифты могут возвращать очень разные размеры ограничивающего прямоугольника
  2. Многострочный текст: Для многострочного текста ограничивающий прямоугольник включает область всех строк
  3. Вопросы производительности: Частые вызовы могут влиять на производительность; рекомендуется кэшировать результаты
  4. Точность: Расчёт ограничивающего прямоугольника является приближённым; фактический рендеринг может немного отличаться

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

Другие расширения