Método Pillow ImageDraw textbbox()
textbbox()El método esImageDrawuna función muy útil en el módulo, que se utiliza para calcular el cuadro delimitador (bounding box) que ocupará el texto dado al dibujarlo en la imagen.
textbbox()El método no dibuja realmente el texto, sino que devuelve las coordenadas del área rectangular que ocupará el texto.
Sintaxis del método
textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0)
Explicación detallada de los parámetros
1. xy (obligatorio)
- Tipo: tupla de dos elementos (x, y)
- Descripción: especifica la posición de coordenadas inicial del texto
- Nota: la posición real del texto también se ve afectada por los
anchorparámetros
2. text (obligatorio)
- Tipo: cadena de caracteres
- Descripción: contenido de texto para el cual se debe calcular el cuadro delimitador
3. font (opcional)
- Tipo:
ImageFont: objeto - Valor predeterminado: None (usa la fuente predeterminada)
- Descripción: especifica la fuente utilizada para el texto
4. anchor (opcional)
- Tipo: cadena de caracteres
- Valor predeterminado: None (equivalente a "la")
- Descripción: controla la alineación del texto con respecto a las coordenadas xy
- Valores comunes:
- "la": alineación izquierda, alineación de línea base (predeterminado)
- "lt": alineación izquierda, alineación superior
- "ma": alineación centrada, alineación de línea base
- "mm": completamente centrado (horizontal y vertical)
5. spacing (opcional)
- Tipo: entero
- Valor predeterminado: 4
- Descripción: interlineado para texto de varias líneas
6. align (opcional)
- Tipo: cadena de caracteres
- Valor predeterminado: "left"
- Descripción: alineación del texto de varias líneas ("left", "center", "right")
7-10. Otros parámetros avanzados
direction,features,language,stroke_widthparámetros como estos se utilizan para controlar características avanzadas del renderizado de texto; los principiantes normalmente no necesitan dominarlos de inmediato.
Valor de retorno
textbboxEl método devuelve una tupla de cuatro elementos(left, top, right, bottom)que representa las coordenadas del cuadro delimitador del texto.
Ejemplos de aplicación práctica
Ejemplo 1: Uso básico
Ejemplo
# Crear una imagen en blanco
image = Image.new('RGB', (400, 200), 'white')
draw = ImageDraw.Draw(image)
# Cargar la fuente
font = ImageFont.truetype('arial.ttf', 24)
# Calcular el cuadro delimitador del texto
bbox = draw.textbbox((50, 50), "Hello Pillow!", font=font)
print("Cuadro delimitador del texto:", bbox) # Salida: (left, top, right, bottom)
# Dibujar el cuadro delimitador (visualización)
draw.rectangle(bbox, outline='red')
# Dibujar el texto realmente
draw.text((50, 50), "Hello Pillow!", font=font, fill='black')
image.show()
Ejemplo 2: Uso del parámetro anchor
Ejemplo
# Coordenadas del punto central
center_x, center_y = 200, 100
# Calcular el cuadro delimitador del texto con alineación centrada
bbox = draw.textbbox((center_x, center_y), "Centered", font=font, anchor="mm")
print("Cuadro delimitador centrado:", bbox)
# Dibujar el punto central y el cuadro delimitador
draw.rectangle(bbox, outline='blue')
draw.ellipse([(center_x-2, center_y-2), (center_x+2, center_y+2)], fill='green')
# Dibujar el texto
draw.text((center_x, center_y), "Centered", font=font, fill='black', anchor="mm")
image.show()
Escenarios de aplicación comunes
- Cálculo de diseño de texto: determinar el espacio que ocupará antes de dibujar el texto
- Manejo de ajuste de línea automático: calcular cómo se ajusta el texto según el ancho disponible
- Centrado de texto: lograr un centrado preciso combinando el cálculo del cuadro delimitador
- Detección de colisiones: evitar que el texto se superponga con otros elementos
Notas
- Influencia de la fuente: el tamaño del cuadro delimitador devuelto puede variar mucho según la fuente
- Texto de varias líneas: para texto de varias líneas, el cuadro delimitador incluye el área de todas las líneas
- Consideraciones de rendimiento: las llamadas frecuentes pueden afectar el rendimiento; se recomienda almacenar en caché los resultados
- Precisión: el cálculo del cuadro delimitador es aproximado; la representación real puede variar ligeramente
Comparación con textsize
En versiones anteriores de Pillow, se usaba comúnmentetextsizeel método para obtener las dimensiones del texto, pero este método ha quedado obsoleto.textbboxProporciona información más precisa (no solo ancho y alto, sino también información de posición), y es el método preferido para código nuevo.
Ejemplo
width, height = draw.textsize("Text", font=font)
# Método nuevo (recomendado)
left, top, right, bottom = draw.textbbox((0, 0), "Text", font=font)
width = right - left
height = bottom - top
Resumen
ImageDraw.textbboxEl método es una herramienta potente y práctica de la biblioteca Pillow, especialmente adecuada para escenarios que requieren un control preciso del diseño de texto. Al comprender sus parámetros y valores de retorno, los desarrolladores pueden implementar fácilmente diversas necesidades complejas de diseño de texto.