Con esta herramienta puedes convertir una imagen a ASCII: sube una foto o un dibujo y obtendrás el mismo dibujo hecho solo con letras y signos, como @, # o :. Puedes hacerlo en blanco y negro o en color, ajustar el tamaño, el brillo y los caracteres, y copiar el resultado o descargarlo como texto, como página HTML o como imagen PNG. Es gratis, funciona en línea sin registrarte y la imagen no sale de tu equipo: todo se calcula en tu navegador.
Tu imagen no se sube a ningún sitio. El navegador la lee y la convierte en tu propio equipo, así que puedes usar fotos personales sin preocuparte. Funciona con JPG, PNG, WebP, GIF (el primer fotograma) y los demás formatos que tu navegador sepa abrir. La foto de ejemplo, una guacamaya azul y amarilla, es de Jebulon y está en el dominio público (Wikimedia Commons).
Cómo convertir una imagen a ASCII
- Elige la imagen. Pulsa «Elegir imagen», arrástrala sobre el recuadro o cópiala y pégala con Ctrl+V (Cmd+V en Mac). Al abrir la página verás de ejemplo una guacamaya en color; cambia el modo a blanco y negro para compararla.
- Elige el modo. En blanco y negro cada carácter representa el brillo de una zona de la imagen. En color, además, cada carácter lleva el color de esa zona, y queda mejor sobre fondo oscuro.
- Ajusta el ancho. Es el número de caracteres por línea. Con 60 a 80 se reconocen las formas y el texto cabe en un mensaje; con 150 o más se ven los detalles.
- Retoca brillo y contraste si la imagen sale muy clara o muy empastada. Subir el contraste suele ayudar con las fotos.
- Copia o descarga. «Copiar el texto» y «Descargar TXT» guardan solo los caracteres. Para conservar el color, descarga el HTML (se abre en cualquier navegador) o el PNG (una imagen lista para compartir).
Cómo funciona
La idea es sencilla: cada carácter ocupa más o menos espacio con tinta. Una @ llena casi toda su casilla, un : apenas unos puntos y un espacio nada. Si se ordenan de más tinta a menos, sirven como una escala de grises.
- Se reduce la imagen hasta tener una casilla por carácter: con 100 de ancho, cada fila de la imagen se resume en 100 casillas, y en cada una se toma el color medio.
- Se calcula el brillo de cada casilla con la fórmula de la luminancia, que pesa más el verde que el rojo y el azul porque el ojo es más sensible a él:
0.2126 × R + 0.7152 × G + 0.0722 × B. - Se elige el carácter cuya «cantidad de tinta» corresponde a ese brillo: las zonas oscuras reciben
@o#y las claras.o un espacio. Con «Invertir» se hace al revés, que es lo que conviene sobre fondo oscuro. - Se corrige la proporción. Una letra es casi el doble de alta que de ancha, así que se usan aproximadamente la mitad de filas que de columnas. Si no, la imagen saldría estirada hacia abajo.
- En color, cada carácter se pinta además con el color medio de su casilla.
Qué caracteres elegir
| Juego | Caracteres | Para qué |
|---|---|---|
| Estándar | @%#*+=-:. y espacio | El más equilibrado: se lee bien a cualquier tamaño. |
| Detallado | 70 caracteres, de $@B%8& a '. | Más tonos intermedios. Luce en imágenes grandes, de 150 columnas o más. |
| Bloques | █▓▒░ y espacio | Aspecto de píxel, muy sólido, y queda muy bien en color. Necesita una letra que tenga esos símbolos. |
| Mínimo | #+. y espacio | Siluetas y logotipos, o para pegar en sitios que deforman los caracteres raros. |
| Los míos | Los que escribas | Ponlos de más «oscuro» (más tinta) a más claro. Por ejemplo, las letras de tu nombre. |
Consejos para que quede bien
- Elige imágenes con buen contraste y un fondo sencillo: retratos con fondo liso, logotipos, siluetas. Las fotos con mucho detalle pequeño se convierten en ruido.
- Para pegarlo en un chat o en un foro, usa un bloque de código, que muestra el texto con letra monoespaciada (todas las letras igual de anchas). En Discord, Slack o GitHub se escribe entre tres comillas invertidas (
```). Si no, con una letra normal la imagen se deforma. - Si se ve deformado o desalineado, casi siempre es por la letra: cambia el texto a una letra monoespaciada, como Consolas, Courier New o Menlo.
- En el móvil, la vista previa se reduce para que quepa entera; puedes ampliar con los dedos o descargar el PNG para verla grande.
Convertir una imagen a ASCII en Python
El mismo cálculo, sin librerías: aquí la «imagen» es una esfera iluminada que se calcula en el propio programa, y cada carácter es la media de brillo de su casilla.
# Convierte una imagen en escala de grises a ASCII. Para no depender de nada, la «imagen» es una esfera
# iluminada desde arriba a la izquierda, calculada aquí mismo: cada píxel es un brillo de 0 (negro) a 255 (blanco).
import math
JUEGO = "@%#*+=-:. " # del carácter con más tinta al más claro
ANCHO, ALTO = 240, 160 # tamaño de la imagen en píxeles
def esfera(x, y):
cx, cy, r = 120, 80, 70
dx, dy = (x - cx) / r, (y - cy) / r
d2 = dx * dx + dy * dy
if d2 >= 1:
return 255 # fondo blanco
dz = math.sqrt(1 - d2)
luz = max(0.0, (-dx - dy + dz) / math.sqrt(3)) # luz que llega desde arriba a la izquierda
return round(20 + 190 * luz) # de 20 (sombra) a 210: el blanco puro queda para el fondo
def a_ascii(brillo, ancho, alto, columnas, proporcion=0.55):
filas = round(columnas * alto / ancho * proporcion) # un carácter es más alto que ancho
salida = []
for f in range(filas):
linea = ""
for c in range(columnas):
# brillo medio de la casilla que le toca a este carácter
x0, x1 = c * ancho // columnas, (c + 1) * ancho // columnas
y0, y1 = f * alto // filas, (f + 1) * alto // filas
valores = [brillo(x, y) for y in range(y0, y1) for x in range(x0, x1)]
media = sum(valores) / len(valores)
linea += JUEGO[round(media / 255 * (len(JUEGO) - 1))]
salida.append(linea.rstrip())
return "\n".join(salida)
print(a_ascii(esfera, ANCHO, ALTO, 48))$ python3 ascii.py
..::::--::.
.:::::----==+++=.
.::::::::---===++*#+.
.::::::::::---===++**#%=
.::::::::::----==+++**#%%+
:::::::::-----===++**##%%%-
:-::::::-----====++***##%%%#
-----------====+++***##%%%%%
---------=====+++***##%%%%%%
-===========+++***###%%%%%%#
.+======+++++****##%%%%%%%%=
-++++++++****###%%%%%%%%%*
-********####%%%%%%%%%%*
:*######%%%%%%%%%%%%#-
:*%%%%%%%%%%%%%%*-
:=*######*+-.Con una foto de verdad, la librería Pillow (pip install pillow) se encarga de abrirla, pasarla a gris y reducirla. Image.BOX hace la media de cada casilla, como arriba; otros métodos de reducción, como LANCZOS, dejan puntos sueltos alrededor de los bordes:
from PIL import Image # pip install pillow
JUEGO = "@%#*+=-:. "
def imagen_a_ascii(ruta, columnas=100, proporcion=0.55):
im = Image.open(ruta).convert("L") # escala de grises
ancho, alto = im.size
filas = max(1, round(columnas * alto / ancho * proporcion))
im = im.resize((columnas, filas), Image.BOX) # media de cada casilla
pixeles = im.load()
lineas = []
for y in range(filas):
linea = "".join(JUEGO[pixeles[x, y] * (len(JUEGO) - 1) // 255] for x in range(columnas))
lineas.append(linea.rstrip())
return "\n".join(lineas)
print(imagen_a_ascii("foto.jpg", 60))Preguntas frecuentes
¿Es gratis? Sí, sin límite de imágenes, sin registrarte y sin marcas de agua.
¿Se guarda mi imagen en algún servidor? No. La página carga el programa una vez y a partir de ahí todo ocurre en tu navegador. Puedes comprobarlo desconectándote de internet: la herramienta sigue funcionando.
¿Por qué el texto copiado no tiene color? Porque el texto plano no guarda colores. Para conservarlos, descarga el HTML o el PNG.
¿Qué es el arte ASCII? Dibujos hechos con los caracteres del teclado. ASCII es el código de 1963 que numeró las letras, cifras y signos de la escritura inglesa, y durante décadas fue lo único que podían mostrar muchas pantallas e impresoras; de ahí que la gente dibujara con letras. El juego «Bloques» usa caracteres que no son ASCII, sino de Unicode, pero el resultado se sigue llamando así.
Si trabajas con datos, también te pueden servir el formateador de JSON y el conversor de fechas Unix, o convertir una URL en código QR. Todas las herramientas están en Herramientas.