es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo anclo el texto y lo ajusto para que encaje en una imagen?

Encontré este código en la API de PIL (aquí está el enlace: https://pillow.readthedocs.io/en/stable/handbook/text-anchors.html) y también quería reducirlo según el tamaño del texto mientras está centrado.

Aquí está el código de anclaje:

from PIL import Image, ImageDraw, ImageFont

font = ImageFont.truetype("mont.ttf", 48)
im = Image.new("RGB", (200, 200), "white")
d = ImageDraw.Draw(im)
d.text((100, 100), "Quick", fill="black", anchor="ms", font=font)
im.save('text.png')

Y el resultado se ve así:

Imagen

Pero si aumentas el tamaño de la palabra, se verá así:

Imagen

Entonces solo quiero que el texto esté centrado y reducido para ajustarse a la imagen.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una opción para lograr esto sería modificar el código para cambiar dinámicamente el tamaño de la fuente basado en la longitud del texto que se está dibujando. Aquí hay un ejemplo de modificación que escala el tamaño de la fuente basado en la longitud del texto:

    from PIL import Image, ImageDraw, ImageFont
    
    def draw_text_centered(im, text, font_size=48, fill='black'):
        # Calcula una estimación inicial para el tamaño de la fuente basado en la longitud del texto
        font = ImageFont.truetype("mont.ttf", font_size)
        width, height = font.getsize(text)
        while width > im.width or height > im.height:
            font_size -= 1
            font = ImageFont.truetype("mont.ttf", font_size)
            width, height = font.getsize(text)
    
        # Calcula la posición para centrar el texto en la imagen
        x = (im.width - width) // 2
        y = (im.height - height) // 2
    
        # Dibuja el texto con la posición centrada
        d = ImageDraw.Draw(im)
        d.text((x, y), text, fill=fill, font=font, anchor='ms')
    
    im = Image.new("RGB", (200, 200), "white")
    draw_text_centered(im, "Quick")
    im.save('text.png')
    

    Este código define una nueva función draw_text_centered que toma un objeto imagen, una cadena de texto y argumentos opcionales de tamaño de fuente y color de relleno. La función comienza intentando calcular un tamaño de fuente que se ajuste al texto dentro de los límites de la imagen. Si el texto es demasiado ancho o alto para la imagen, disminuye el tamaño de la fuente y lo intenta nuevamente hasta encontrar un tamaño que se ajuste.

    Una vez que tiene un tamaño de fuente adecuado, la función calcula las coordenadas para centrar el texto dentro de la imagen y utiliza estas coordenadas para dibujar el texto con un anclaje centrado. Luego, el código crea un nuevo objeto de imagen, llama a la función draw_text_centered con el texto deseado y guarda la imagen resultante en el disco.

    Usando este código modificado, deberías poder generar texto centrado con un tamaño de fuente que se ajusta según la longitud del texto.

Comments are closed.