JUDIS Descargar JUDIS
Receta pública

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…

11 pasos guiados·Dificultad fácil

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
Pág. 1

Paso a paso

1

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.

2

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.

Escribe:
# ==========================================
# 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.

3

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.

4

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.

5

Paso 5

Busca tu archivo GIF y selecciónalo con un click.

Listo cuando: El archivo GIF queda resaltado como seleccionado.

6

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'.

7

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.

8

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'.

9

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'.

10

Paso 10

Toca 'Descargar'.

Listo cuando: El navegador muestra la descarga del video .mp4.

11

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.