Cómo procesar un GIF a video ASCII en Google Colab
Convertir un GIF en un video hecho con caracteres ASCII usando un código en Google Colab, y descargar el video a tu computador. Guía paso a paso (11 pas…
JUDIS te señala cada botón sobre tu propia pantalla mientras lo haces. Sin la app, los pasos se leen igual aquí.
Antes de empezar
Tener una cuenta de Google con la sesión iniciada en el navegador y el archivo GIF que quieres convertir guardado en tu computador (por ejemplo, en Descargas).
Ten a la mano
- El archivo GIF que quieres procesar a video ASCII · suele estar en Descargas del navegador
Paso a paso
Paso 1
Abre una pestaña nueva, escribe colab.new en la barra de direcciones y presiona Enter.
Escribe: colab.new
Listo cuando: Se abre un notebook nuevo de Google Colab (tipo 'Untitled.ipynb') con una celda de código vacía.
Paso 2
Copia el código completo que está en la cajita de Judis ('Texto exacto' de este paso) y pégalo en la celda de código vacía del notebook.
# ==========================================
# 1. INSTALACIÓN DE DEPENDENCIAS
# ==========================================
import os
import cv2
import numpy as np
from PIL import Image, ImageEnhance, ImageFilter, ImageDraw, ImageFont
from google.colab import files
# Instalar fuente monoespaciada
!apt-get install -y ttf-dejavu > /dev/null 2>&1
ASCII_CHARS = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvrjfI1?i+~i!lI;:,\"^`'. "
# ==========================================
# 2. PROCESAMIENTO ASCII CON MAYOR ALTURA
# ==========================================
def frame_to_ascii_grid(frame_pil, width_chars=320, height_factor=0.9, contrast=2.4):
img = frame_pil.convert("L")
img = img.filter(ImageFilter.UnsharpMask(radius=2.0, percent=300, threshold=1))
img = ImageEnhance.Contrast(img).enhance(contrast)
w_orig, h_orig = img.size
aspect_ratio = h_orig / w_orig
pixel_width = width_chars
# height_factor a 0.9 aumenta las filas de texto verticalmente
pixel_height = int(pixel_width * aspect_ratio * height_factor)
img_resized = img.resize((pixel_width, pixel_height), Image.Resampling.LANCZOS)
ascii_grid = []
num_chars = len(ASCII_CHARS)
for y in range(pixel_height):
row = []
for x in range(pixel_width):
px = img_resized.getpixel((x, y))
char_idx = int((px / 255) * (num_chars - 1))
row.append(ASCII_CHARS[char_idx])
ascii_grid.append(row)
return ascii_grid, pixel_width, pixel_height
def render_ascii_ultra_tight(
ascii_grid,
pixel_width,
pixel_height,
font_size=12,
bg_color=(0, 0, 0),
text_color=(255, 255, 255)
):
font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf"
try:
font = ImageFont.truetype(font_path, font_size)
except Exception:
font = ImageFont.load_default()
bbox = font.getbbox("W")
char_w = bbox[2] - bbox[0]
char_h = bbox[3] - bbox[1]
# Paso apretado sin espacios
step_x = char_w * 0.72
step_y = char_h * 0.85
margin = 20
canvas_w = int(pixel_width * step_x) + (margin * 2)
canvas_h = int(pixel_height * step_y) + (margin * 2)
canvas = Image.new("RGB", (canvas_w, canvas_h), color=bg_color)
draw = ImageDraw.Draw(canvas)
for y in range(pixel_height):
for x in range(pixel_width):
char = ascii_grid[y][x]
if char != ' ':
pos_x = margin + (x * step_x)
pos_y = margin + (y * step_y)
draw.text((pos_x, pos_y), char, font=font, fill=text_color)
return canvas
def process_gif_in_colab(gif_path, output_mp4="caballo_ascii_ultra_hd.mp4", width_chars=320):
try:
gif = Image.open(gif_path)
except Exception as e:
print(f"❌ Error al abrir el GIF: {e}")
return None
fps = 12
if "duration" in gif.info and gif.info["duration"] > 0:
fps = 1000 / gif.info["duration"]
frames_processed = []
frame_idx = 0
print(f"🚀 Procesando fotogramas a Alta Resolución ({width_chars} cols)...")
try:
while True:
gif.seek(frame_idx)
frame_pil = Image.new("RGBA", gif.size)
frame_pil.paste(gif)
# 1. Matriz con height_factor=0.9 para dar más altura
ascii_grid, p_w, p_h = frame_to_ascii_grid(
frame_pil,
width_chars=width_chars,
height_factor=0.9,
contrast=2.4
)
# 2. Renderizado compacto
frame_rendered = render_ascii_ultra_tight(
ascii_grid, p_w, p_h,
font_size=12
)
frames_processed.append(frame_rendered)
frame_idx += 1
print(f"✔️ Frame {frame_idx} procesado.")
except EOFError:
pass
if not frames_processed:
print("❌ No se encontraron fotogramas.")
return None
# 3. Exportar MP4
v_w, v_h = frames_processed[0].size
if v_w % 2 != 0: v_w += 1
if v_h % 2 != 0: v_h += 1
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_mp4, fourcc, fps, (v_w, v_h))
for frame in frames_processed:
if frame.size != (v_w, v_h):
frame = frame.resize((v_w, v_h))
cv_img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
out.write(cv_img)
out.release()
print(f"\n🎉 ¡Proceso finalizado! Archivo guardado en Colab como '{output_mp4}'.")
return output_mp4
# ==========================================
# 3. EJECUCIÓN
# ==========================================
print("📂 Sube tu archivo GIF:")
uploaded = files.upload()
if uploaded:
input_gif = list(uploaded.keys())[0]
output_mp4 = "caballo_ascii_ultra_hd.mp4"
res = process_gif_in_colab(input_gif, output_mp4, width_chars=320)
if res and os.path.exists(res):
print("\n📁 El video está listo. Puedes encontrarlo en la pestaña de archivos (ícono de carpeta a la izquierda en Colab) para descargarlo cuando quieras.")Listo cuando: La celda muestra el código completo, empezando por '# 1. INSTALACIÓN DE DEPENDENCIAS', con colores de sintaxis.
Paso 3
Toca el botón de play redondo a la izquierda de la celda para ejecutar el código.
Listo cuando: El código empieza a correr y debajo de la celda aparece un botón para elegir archivos.
Paso 4
Toca el botón 'Elegir archivos' que apareció debajo de la celda.
Listo cuando: Se abre la ventana de tu computador para buscar y elegir un archivo.
Paso 5
Busca tu archivo GIF y selecciónalo con un click.
Listo cuando: El archivo GIF queda resaltado como seleccionado.
Paso 6
Antes: Tu archivo GIF debe estar seleccionado antes de tocar Abrir.
Toca el botón 'Abrir' para subir el GIF a Colab.
Listo cuando: La ventana se cierra y debajo de la celda aparece el nombre de tu GIF con '100% done'.
Paso 7
Espera sin cerrar la pestaña mientras el código procesa el GIF.
Listo cuando: Aparece un mensaje de proceso finalizado que dice que el video quedó guardado en Colab.
Paso 8
Toca el ícono de carpeta en la barra de la izquierda para abrir los archivos.
Listo cuando: Se abre el panel 'Archivos' y ahí aparece un video cuyo nombre termina en '_ascii_ultra_hd.mp4'.
Paso 9
Haz click derecho sobre el video que termina en '_ascii_ultra_hd.mp4' (o toca sus tres puntos).
Listo cuando: Se abre un menú con la opción 'Descargar'.
Paso 10
Toca 'Descargar'.
Listo cuando: El navegador muestra la descarga del video .mp4.
Paso 11
Abre el video descargado para verlo.
Listo cuando: El video se reproduce y se ve tu GIF dibujado con caracteres ASCII.
Qué puede cambiar en tu caso
El nombre del notebook y del archivo GIF pueden variar según lo que cada persona tenga. Los nombres de los botones pueden variar ligeramente según el idioma de la interfaz de Colab. El tiempo de ejecución del código puede cambiar según el tamaño del archivo y los recursos disponibles.
En qué se suele equivocar la gente
No esperar a que aparezca el botón 'Elegir archivos' antes de buscar el GIF. Cerrar o recargar Colab mientras el código todavía está procesando. No encontrar el video porque el panel de archivos no se ha actualizado.