Escribe un texto con la forma de una imagen
caligrama recibe una imagen y un texto, detecta la silueta del objeto y escribe el texto dentro,
letra por letra. Devuelve un str normal que puedes imprimir, pegar en un chat, guardar
en un archivo o convertir en un SVG animado.
Este corazón lo genera la propia librería con caligrama.animar(..., latido=0.22, paso=3).
100 % Rust
Decodificar, segmentar y componer se hace en Rust. El paquete de Python no tiene dependencias.
Offline
No usa red. La imagen y el texto nunca salen de tu máquina.
API y CLI
import caligrama desde Python o el comando caligrama en la terminal. Hacen lo mismo.
La API está en español: las funciones son dibujar, analizar, animar,
a_svg y reproducir, y los argumentos se llaman ancho, espacios,
huecos, etc. Esta página explica cada uno con ejemplos que puedes copiar.
01Instalación#
$ pip install caligrama- Python 3.9 o superior. Se publica una sola wheel
abi3que sirve para todas las versiones. - Plataformas: Linux (x86_64 y aarch64, glibc y musl), macOS (Intel y Apple Silicon) y Windows x64.
- Sin dependencias: no instala Pillow, numpy ni nada más.
- Formatos de imagen: PNG, JPEG, GIF, BMP y WebP.
Comprueba que quedó instalado:
$ python -c "import caligrama; print(caligrama.__version__)"
$ caligrama --helpCon uv o pipx puedes usar solo el comando, sin tocar tu entorno:
$ uvx caligrama foto.png -t "hola"
$ pipx install caligrama02Inicio rápido#
Desde Python
import caligrama
dibujo = caligrama.dibujar("logo.png", "Hola mundo, esto es caligrama", ancho=30)
print(dibujo)Con el logo de Python (fondo blanco, serpientes azul y amarilla) sale esto:
Hola mundo,
esto es cali
grama Hola mund
o, esto es cal
igrama Hola mundo, esto es
caligrama Hola mund o, est
o es caligrama Hola m undo, e
sto es ca ligrama Hola mundo,
esto e s caligrama Hola mund
o, est o es caligrama Hola
mundo , esto es caligrama
Hola mundo,El texto se repite hasta llenar la figura. Si prefieres que salga una sola vez, usa ancho="auto" y repetir=False (más abajo se explica).
Desde la terminal
$ caligrama logo.png -w 30 -t "Hola mundo, esto es caligrama"
$ caligrama logo.png -f poema.txt # el texto desde un archivo
$ cat poema.txt | caligrama logo.png # o desde stdin
$ caligrama logo.png -f poema.txt > tarjeta.txt # guardar el resultado03Imagen y texto de entrada#
La imagen
El argumento imagen acepta tres cosas:
from pathlib import Path
import caligrama
caligrama.dibujar("gato.png", texto) # ruta como str
caligrama.dibujar(Path("fotos") / "gato.png", texto) # cualquier os.PathLike
caligrama.dibujar(Path("gato.png").read_bytes(), texto) # bytes crudos del archivoLos bytes sirven para imágenes que no están en disco: una descarga con requests, un upload de Flask/FastAPI o un blob de base de datos. El formato se detecta por el contenido, no por la extensión.
Qué imagen funciona mejor: un objeto claro sobre un fondo liso (blanco, negro, un color plano o transparente). Logos, siluetas, iconos, ilustraciones y fotos de producto dan muy buen resultado. En fotos con fondo complejo conviene recortar el objeto antes o usar un PNG con transparencia.
El texto
- Cualquier
strde Python. Se recorre por grafemas, así que tildes, ñ, ü y emojis compuestos (👩❤️👨, 🇨🇴) ocupan una celda y no se parten. - Los saltos de línea y tabulaciones se tratan como espacios (ver modos de espacios).
- Un texto vacío (o solo espacios) da
ValueError.
Los emojis y los caracteres CJK suelen ocupar dos columnas en la terminal, así que la figura se deforma un poco donde aparecen. Para dibujos limpios, usa letras latinas.
04dibujar()#
La función principal. Devuelve el caligrama como un solo str con saltos de línea \n, sin espacios sobrantes a la derecha y sin filas vacías arriba o abajo.
caligrama.dibujar(
imagen, # str | os.PathLike | bytes
texto, # str
ancho=60, # int | "auto"
aspecto=2.0,
repetir=True,
espacios="normal", # "normal" | "sin" | "todos"
umbral=None, # int 0-255 | None (automático)
invertir=False,
huecos=False,
suavizar=0,
desfase=0,
color=False,
) -> str| Argumento | CLI | Por defecto | Qué hace |
|---|---|---|---|
ancho | -w, --ancho | 60 | Columnas del dibujo. Más ancho = más detalle y más letras. "auto" elige el menor ancho donde cabe todo el texto. |
aspecto | --aspecto | 2.0 | Alto/ancho de un carácter. En casi todas las terminales es ~2. Si el dibujo se ve estirado en vertical, súbelo; si se ve aplastado, bájalo. |
repetir | --sin-repetir | True | Repite el texto hasta llenar la figura. Con False se escribe una vez y el resto de la figura queda vacía. |
espacios | --espacios | "normal" | Qué hacer con los espacios del texto. Ver modos. |
umbral | --umbral | auto | Qué tan distinto del fondo debe ser un píxel para contar como figura (0–255). |
invertir | --invertir | False | Escribe en el fondo y deja la figura vacía. |
huecos | --con-huecos | False | Respeta los huecos interiores del color del fondo (el ojo de un logo, el centro de una dona). |
suavizar | --suavizar | 0 | Une trazos finos o punteados antes de muestrear (radio en píxeles de la imagen original). |
desfase | --desfase | 0 | Empieza a escribir N letras más adelante en el texto. |
color | --colores imagen | False | Cada letra toma el color de la imagen en su posición (ANSI de 24 bits dentro del str). |
Elegir el ancho
- 30–50: mensajes cortos, chats, commits, la bio de un perfil.
- 60–80: poemas, tarjetas, la mayoría de terminales.
- 100–200: figuras con mucho detalle o palabras (el título animado del README usa 160). Necesitan un texto largo o
repetir=True.
Si tu texto debe salir completo y exactamente una vez, deja que caligrama calcule el ancho:
poema = open("becquer.txt", encoding="utf-8").read()
print(caligrama.dibujar("logo.png", poema, ancho="auto", repetir=False))"auto" busca el menor ancho cuya figura tiene al menos tantas celdas como letras tiene el texto (hasta 1000 columnas). Con repetir=True el final de la figura se rellena con el principio del texto; con repetir=False quedan en blanco las pocas celdas que sobren.
Guardar el resultado
from pathlib import Path
dibujo = caligrama.dibujar("gato.png", "miau " * 50, ancho=50)
Path("gato.txt").write_text(dibujo + "\n", encoding="utf-8")Para verlo bien fuera de la terminal, usa siempre una fuente monoespaciada: un bloque ``` en Markdown, WhatsApp o Discord, o un <pre> en HTML.
05Modos de espacios#
Los espacios también ocupan celdas. El argumento espacios decide qué hacer con ellos:
| Modo | Qué hace | Úsalo para |
|---|---|---|
"normal" | Junta espacios, saltos de línea y tabs seguidos en uno solo, y separa cada repetición del texto con un espacio. | Casi siempre. Es lo que mejor se lee. |
"sin" | Quita todos los espacios y pega las repeticiones. | Figuras más sólidas; palabras sueltas como "caligrama"; imágenes a color. |
"todos" | Deja cada espacio como está (un salto de línea o un tab = un espacio). No agrega separador entre repeticiones y descarta los saltos de línea del final. | Texto que ya está maquetado, o cuando la sangría importa. |
texto = "te quiero\nmucho"
caligrama.dibujar("corazon.png", texto, espacios="normal") # "te quiero mucho te quiero mucho ..."
caligrama.dibujar("corazon.png", texto, espacios="sin") # "tequieromuchotequieromucho..."
caligrama.dibujar("corazon.png", texto, espacios="todos") # "te quiero muchote quiero mucho..."analizar() y ancho="auto" cuentan las letras con el mismo modo, así que sus números coinciden con el dibujo.
06Controlar la silueta#
Saber cómo decide caligrama qué es figura te ayuda a elegir las opciones:
- Si la imagen tiene transparencia, la figura es lo que no es transparente. No hace falta nada más.
- Si no, toma como color de fondo la mediana de los píxeles del borde y marca como figura lo que se aleja de ese color. Por eso funciona con cualquier fondo liso, no solo blanco, y por eso un amarillo claro sobre blanco no desaparece.
- El umbral se calcula solo y se adapta al ruido del JPEG.
- Si hay
suavizar, cierra los trazos. - Rellena los huecos: solo es fondo lo que está conectado al borde. La barriga blanca de un pingüino sobre fondo blanco sigue siendo pingüino.
- Reduce la máscara a una rejilla: una celda es figura si al menos la mitad de sus píxeles lo son.
huecos: conservar agujeros interiores
Por defecto los agujeros se rellenan. Si el hueco es parte del dibujo (el ojo de las serpientes de Python, una letra O, una dona), actívalo:
caligrama.dibujar("logo.png", texto, huecos=True)
$ caligrama logo.png -t "..." --con-huecossuavizar: trazos finos, punteados o hechos de letras
Si la figura sale "rota" o con pedazos sueltos (logos de línea fina, dibujos a lápiz, una imagen que ya es arte ASCII), suavizar=N une los trazos que están a menos de ~N píxeles. Empieza con 2–4 y sube si hace falta.
Ojo: al cerrar un contorno, su interior pasa a ser figura. Si quieres el anillo y no el disco, combínalo con huecos=True.
caligrama.dibujar("firma.png", texto, suavizar=3)
caligrama.dibujar("anillo.png", texto, suavizar=3, huecos=True)umbral: cuando el automático no acierta
El umbral es la distancia de color (0–255) a partir de la cual un píxel es figura. Bájalo (p. ej. 20) si se pierden partes claras o de poco contraste; súbelo (p. ej. 80) si entra ruido, sombras o parte del fondo.
caligrama.dibujar("foto.jpg", texto, umbral=40)Para elegirlo rápido, prueba varios valores con analizar y mira la plantilla (sección siguiente).
invertir: escribir alrededor
Con invertir=True el texto llena el fondo y la figura queda como un hueco en blanco. Útil para logos oscuros o para un efecto de "recorte".
aspecto: proporción de la fuente
Un carácter de terminal es casi el doble de alto que de ancho; aspecto=2.0 lo compensa para que un círculo salga redondo. Si vas a mostrar el resultado con otra fuente u otro interlineado (una web con line-height alto, un SVG), ajusta este valor. a_svg usa el mismo parámetro.
07Diseñar el texto: analizar()#
Antes de escribir un poema para una figura conviene saber cuánto espacio hay. analizar() examina la silueta sin escribir nada.
caligrama.analizar(
imagen, texto=None, ancho=60, aspecto=2.0, espacios="normal",
umbral=None, invertir=False, huecos=False, suavizar=0,
) -> dictinfo = caligrama.analizar("logo.png", "Hola mundo", ancho=30)
info["letras"] # 252 — celdas disponibles a este ancho
info["letras_por_fila"] # [11, 13, 15, 14, 26, 26, 28, 28, 28, 26, 24, 13]
info["ancho_recomendado"] # 7 — el menor ancho donde cabe "Hola mundo"
print(info["plantilla"]) # la figura con '#' en cada celda| Clave | Tipo | Significado |
|---|---|---|
ancho, filas | int | Tamaño del dibujo (ya resuelto si pasaste "auto"). |
letras | int | Celdas de figura = letras que caben (los espacios cuentan). |
palabras_aprox | int | Estimado de palabras que caben. |
letras_por_fila | list[int] | Cuántas letras caben en cada fila, de arriba abajo. |
tramos, tramo_min, tramo_max | int | Tramos continuos de figura y su largo. Entre tramos de una misma fila hay un hueco que puede partir una palabra. |
plantilla | str | La figura con #. Coincide celda a celda con lo que dibujará dibujar() con las mismas opciones. |
letras_por_ancho | dict[int, int] | Capacidad a otros anchos (30, 40, 50, 60, 80, 100, 120). |
texto_letras | int | Solo si pasas texto: cuántas letras tiene, contadas con el mismo modo de espacios. |
ancho_recomendado | int | None | Solo con texto: el ancho que usaría "auto". None si no cabe ni a 1000 columnas. |
sobran | int | Solo con texto: letras - texto_letras. Negativo = faltan celdas. |
Desde la terminal
$ caligrama analizar logo.png -w 40 -t "Podrá nublarse el sol eternamente"
$ caligrama analizar logo.png -f poema.txt # con tu poema
$ caligrama analizar logo.png # sin texto: solo la capacidadSilueta a 40 columnas × 16 filas
Caben 452 letras (los espacios cuentan) ≈ 75 palabras
Tramos: 26 (de 5 a 28 letras); cada hueco entre tramos puede partir una palabra
Plantilla (letras por fila a la derecha):
############# │ 13
################# │ 17
################### │ 19
########################## ###### │ 32
...
Otros anchos:
ancho filas letras ≈palabras
30 12 252 42
40 16 452 75
60 23 955 159
Tu texto: 33 letras. Cabe completo desde 11 columnas (-w auto). A 40 columnas sobran 419 letras.caligrama analizar no lee de stdin: el texto es opcional y se pasa con -t o -f.
Flujo recomendado para un poema a medida
- Elige la imagen y prueba anchos con
caligrama analizar img.png -w Nhasta que la plantilla se vea bien. - Escribe el texto pensando en
letras(más o menos). Usaletras_por_filasi quieres que un verso caiga en una fila concreta. - Pasa el texto a
analizary mirasobran. Ajusta palabras hasta acercarte a 0, o usaancho="auto". - Dibuja con
repetir=Falsepara que el texto salga una sola vez.
08Color#
Hay dos formas de colorear, y ambas funcionan en la terminal y en SVG:
Los colores de la imagen
Con color=True cada letra lleva el color promedio de los píxeles de figura de su celda (el fondo no aclara los bordes). El color va dentro del str como códigos ANSI de 24 bits.
dibujo = caligrama.dibujar("arbol.png", poema, ancho=70, espacios="sin", color=True)
print(dibujo) # en color en la terminal
svg = caligrama.a_svg(dibujo, fondo="#111") # el SVG respeta esos colores$ caligrama arbol.png -f poema.txt -w 70 --espacios sin --colores imagen
$ caligrama arbol.png -f poema.txt -w 70 --colores imagen --svg arbol.svg --fondo "#111"Si quieres el texto sin códigos ANSI (para guardarlo en un .txt o pegarlo en un chat), no uses color=True: los códigos viajan dentro del str.
Un degradado
Un degradado horizontal con colores en hexadecimal (#rgb o #rrggbb). Se pasa como colores a reproducir y a_svg, o como --colores en el CLI:
$ caligrama logo.png -t "hola" --colores "#ff2d55,#b44dff"
caligrama.reproducir(caligrama.dibujar("logo.png", "hola"), veces=1, colores=["#ff2d55", "#b44dff"])Si el dibujo ya trae colores de la imagen y además pasas un degradado, manda el degradado.
Los colores de terminal funcionan en Windows Terminal, iTerm2, GNOME Terminal, VS Code y casi cualquier terminal moderna. En el cmd.exe antiguo verás códigos raros.
09Animaciones#
Tres funciones que encajan: animar genera los fotogramas, reproducir los muestra en la terminal y a_svg los convierte en un SVG animado.
animar()
caligrama.animar(
imagen, texto,
fotogramas=None, # None = los justos para un bucle sin salto
paso=1, # letras que avanza el texto por fotograma (0 = quieto)
latido=0.0, # 0-1: la figura se encoge hasta este factor y vuelve
# + las mismas opciones de dibujar(): ancho, aspecto, repetir, espacios,
# umbral, invertir, huecos, suavizar, desfase, color
) -> list[str]paso: el texto corre por dentro de la figura. Confotogramas=None, calcula cuántos hacen falta para que el texto dé la vuelta completa y el bucle no tenga salto.latido: la figura late con un pulso doble y se encoge hastalatido·100 % entre latidos. Valores entre0.15y0.3se ven naturales. Sinpaso, usa 24 fotogramas.- Se combinan: un corazón que late con el poema corriendo.
- Todos los fotogramas tienen el mismo tamaño y están alineados, así que se pueden superponer. Máximo 240 fotogramas.
fotos = caligrama.animar("corazon.png", poema, paso=3, latido=0.22, ancho=56)
len(fotos) # número de fotogramas
print(fotos[0]) # cada uno es un str como el de dibujar()reproducir()
caligrama.reproducir(
fotogramas, # str | list[str]
intervalo=0.08, # segundos por fotograma
veces=None, # None = hasta Ctrl+C
colores=None, # degradado opcional, p. ej. ["#ff5f8f", "#ff2d55"]
) -> Nonecaligrama.reproducir(fotos, intervalo=0.07, colores=["#ff5f8f", "#ff2d55"])
caligrama.reproducir(fotos, veces=3) # tres vueltas y terminaOculta el cursor mientras anima y lo restaura siempre, incluso si pulsas Ctrl+C (que lanza KeyboardInterrupt como de costumbre).
a_svg()
caligrama.a_svg(
fotogramas, # str (estático) | list[str] (animado)
intervalo=0.08,
colores=("#ff2d55", "#b44dff"), # degradado (se ignora si los fotogramas traen color ANSI)
fondo=None, # None = transparente
tamano=14.0, # tamaño de letra en px
aspecto=2.0,
) -> strfrom pathlib import Path
svg = caligrama.a_svg(fotos, intervalo=0.07, fondo="#14111a")
Path("latido.svg").write_text(svg, encoding="utf-8")
# Un solo dibujo, estático:
Path("logo.svg").write_text(caligrama.a_svg(caligrama.dibujar("logo.png", "hola")), encoding="utf-8")El SVG no necesita JavaScript: anima con CSS y funciona en <img>, en un README de GitHub y en la mayoría de visores. Con color=True cada letra lleva su propia etiqueta y el archivo pesa más; limita fotogramas si va a una web o a un README.
Desde la terminal
$ caligrama animar corazon.png -f poema.txt --paso 3 --latido 0.22 -w 56 # Ctrl+C para salir
$ caligrama animar corazon.png -f poema.txt --paso 3 --veces 2
$ caligrama animar corazon.png -f poema.txt --paso 3 --svg latido.svg --fondo "#14111a"
$ caligrama animar titulo.png -t caligrama -w 160 --espacios sin --con-huecos \
--colores "#ff2d55,#ff8a3d,#b44dff" --svg titulo.svgSi la salida no es una terminal (por ejemplo, la rediriges a un archivo), animar da una sola vuelta.
10Referencia del CLI#
caligrama IMAGEN [opciones] # escribe el texto dentro de la silueta
caligrama analizar IMAGEN [opciones] # examina la silueta para diseñar el texto
caligrama animar IMAGEN [opciones] # anima en la terminal o en un SVGEl texto sale de -t, de -f o, si no pasas ninguno, de stdin (excepto en analizar). No se pueden usar -t y -f a la vez.
Opciones comunes
| Opción | Python | Descripción |
|---|---|---|
-t, --texto TEXTO | texto | Mensaje a escribir. |
-f, --archivo RUTA | — | Leer el mensaje de un archivo (UTF-8). |
-w, --ancho N|auto | ancho | Columnas de salida (60). |
--aspecto F | aspecto | Alto/ancho de un carácter (2.0). |
--umbral N | umbral | Umbral 0–255 figura/fondo (auto). |
--sin-repetir | repetir=False | No repetir el texto. |
--espacios MODO | espacios | normal, sin o todos. |
--invertir | invertir=True | Escribir en el fondo. |
--con-huecos | huecos=True | Respetar huecos interiores. |
--suavizar N | suavizar | Unir trazos finos (radio en px). |
--desfase N | desfase | Empezar N letras más adelante. |
-h, --help | — | Ayuda completa. |
Salida (dibujar y animar)
| Opción | Python | Descripción |
|---|---|---|
--colores C1,C2,... | colores | Degradado en hexadecimal. |
--colores imagen | color=True | Cada letra con el color de la imagen. |
--svg RUTA | a_svg() | Guardar un SVG en vez de imprimir. |
--fondo COLOR | fondo | Fondo del SVG (transparente si no se indica). |
--tamano PX | tamano | Tamaño de letra del SVG (14). |
Solo animar
| Opción | Python | Descripción |
|---|---|---|
--paso N | paso | Letras que avanza el texto por fotograma (1; 0 = quieto). |
--latido F | latido | La figura late encogiéndose hasta F (0–1). |
--fotogramas N | fotogramas | Cuántos fotogramas (auto: bucle sin salto). |
--intervalo S | intervalo | Segundos por fotograma (0.08). |
--veces N | veces | Vueltas en la terminal (sin fin; 1 si no es una terminal). |
Las opciones de salida no se aceptan en analizar, y las de animación solo en animar: el CLI avisa si mezclas. Código de salida: 0 si todo va bien, 2 ante cualquier error (el mensaje va a stderr).
11Recetas#
Tarjeta de cumpleaños con los mensajes de todos
import caligrama
mensajes = [
"Feliz cumple, Ana!",
"Que este año te traiga todo lo bueno.",
"Te queremos mucho.",
]
texto = " · ".join(mensajes)
print(caligrama.dibujar("foto_ana.png", texto, ancho="auto", repetir=False))Imagen descargada de internet
import urllib.request
import caligrama
datos = urllib.request.urlopen("https://ejemplo.com/logo.png").read()
print(caligrama.dibujar(datos, "hola desde la web", ancho=50))Endpoint web (FastAPI) que devuelve un SVG
from fastapi import FastAPI, UploadFile, Form
from fastapi.responses import Response
import caligrama
app = FastAPI()
@app.post("/caligrama.svg")
async def generar(imagen: UploadFile, texto: str = Form(...), ancho: int = Form(60)):
try:
dibujo = caligrama.dibujar(await imagen.read(), texto, ancho=ancho)
except ValueError as e:
return Response(str(e), status_code=422)
return Response(caligrama.a_svg(dibujo, fondo="#ffffff"), media_type="image/svg+xml")Todo corre en local, sin llamadas a servicios externos. Limita ancho y el tamaño del upload si el endpoint es público.
Mostrarlo en una página HTML
import html, caligrama
dibujo = caligrama.dibujar("logo.png", "hola", ancho=40)
pagina = f'<pre style="font-family: monospace; line-height: 1">{html.escape(dibujo)}</pre>'Escapa siempre el texto (html.escape) y usa una fuente monoespaciada. Si el line-height no es ~1, ajusta aspecto. Para algo más fiel, inserta el SVG de a_svg.
Jupyter
from IPython.display import SVG, display
import caligrama
display(SVG(caligrama.a_svg(caligrama.dibujar("gato.png", "miau", ancho=50))))Banner de bienvenida para tu CLI
import sys, caligrama
if sys.stdout.isatty():
caligrama.reproducir(caligrama.animar("logo.png", "mi-herramienta", paso=2, ancho=40, espacios="sin"), veces=1)Muchas imágenes de una carpeta
$ for img in fotos/*.png; do
caligrama "$img" -f poema.txt -w auto --sin-repetir > "${img%.png}.txt"
doneMensaje para WhatsApp, Discord o Slack
Genera sin color, con un ancho de 30–40 (las pantallas de móvil son estrechas) y pégalo entre tres comillas invertidas ``` para que se vea en monoespaciada.
Ejemplos del repositorio
$ git clone https://github.com/maosuarez/caligrama && cd caligrama
$ python examples/demo.py # recorrido por la API
$ bash examples/demo.sh # recorrido por la terminal
$ python examples/latido.py # corazón que late (--svg latido.svg para guardarlo)
$ python examples/titulo.py # el título animado del README
$ python examples/arbol.py # el árbol a color12Problemas frecuentes#
| Síntoma | Prueba con |
|---|---|
| La figura sale como un rectángulo o incluye el fondo | El fondo no es liso o toca el borde con otro color. Recorta la imagen, usa un PNG transparente o sube umbral. |
| Faltan partes claras de la figura | Baja umbral (p. ej. 20–30). |
| La figura sale rota, con trozos sueltos | suavizar=2 a 5, o más ancho. |
| Un agujero que debería verse sale relleno | huecos=True / --con-huecos. |
| Se ve estirada o aplastada | Ajusta aspecto a la proporción de tu fuente. |
| Muy poco detalle | Sube ancho. Con textos cortos, deja repetir=True. |
| Las palabras se cortan mucho | Es inevitable en los bordes; prueba otro ancho o desfase, y usa analizar para ver los tramos. |
El texto no cabe con "auto" | Acorta el texto o usa un ancho fijo con repetir=False (lo que sobre se corta). |
Aparecen códigos como \x1b[38;2;... | Tu salida no entiende ANSI. Quita color=True / --colores, o usa una terminal moderna. |
| Letras torcidas al pegarlo | El destino no usa fuente monoespaciada. Envuélvelo en ``` o <pre>. |
| El SVG pesa mucho | Menos fotogramas, menos ancho, o sin color=True. |
13Errores#
| Excepción | Cuándo |
|---|---|
OSError | No se puede leer el archivo (no existe, sin permisos). |
ValueError | La imagen no se puede decodificar; el texto está vacío; no se encontró ninguna silueta en la imagen; opción inválida: ... (ancho 0, modo de espacios desconocido, color mal escrito...); el texto no cabe ni a 1000 columnas con "auto". |
KeyboardInterrupt | Ctrl+C durante reproducir. |
try:
dibujo = caligrama.dibujar(ruta, texto, ancho="auto")
except OSError as e:
print("no pude abrir la imagen:", e)
except ValueError as e:
print("revisa la imagen o las opciones:", e)Los mensajes de error están en español.
14Tipos y versión#
El paquete incluye caligrama.pyi, así que tu editor y mypy/pyright conocen las firmas, los Literal de espacios y el TypedDict que devuelve analizar (caligrama.Analisis).
import caligrama
caligrama.__version__ # "0.3.2"Enlaces: PyPI · GitHub · Reportar un problema · Historia del proyecto
Licencia MIT. Úsalo en lo que quieras, también en proyectos comerciales.