# GIF animado: crear, optimizar y convertir con FFmpeg y Gifsicle
GIF es el formato de animacion mas universal de la web. Aunque WebP animado y APNG ofrecen mejor calidad y compresion, GIF sigue siendo el estandar para compatibilidad total.
## Limitaciones del formato GIF
- Paleta de 256 colores maximo por fotograma (8 bits)
- Transparencia 1-bit: opaco o transparente, sin semitransparencia
- Sin audio
- Archivos grandes comparado con MP4 o WebP animado
- Sin soporte nativo en algunos reproductores offline
## Crear GIF desde video con FFmpeg
### Conversion basica
```bash
# Video -> GIF
ffmpeg -i video.mp4 animacion.gif
# Con control de FPS y dimensiones
ffmpeg -i video.mp4 -vf "fps=10,scale=480:-1" animacion.gif
```
### Metodo con paleta optimizada (alta calidad)
```bash
# Paso 1: generar paleta optima
ffmpeg -i video.mp4 \
-vf "fps=12,scale=600:-1:flags=lanczos,palettegen=stats_mode=diff" \
paleta.png
# Paso 2: crear GIF con la paleta
ffmpeg -i video.mp4 -i paleta.png \
-filter_complex "fps=12,scale=600:-1:flags=lanczos[x];[x][1:v]paletteuse=dither=bayer:bayer_scale=5" \
animacion_hd.gif
```
### Extraer fragmento del video
```bash
# Del segundo 5 al 10
ffmpeg -ss 00:00:05 -t 5 -i video.mp4 \
-vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
fragmento.gif
# Del minuto 1:30 al 1:45
ffmpeg -ss 00:01:30 -to 00:01:45 -i video.mp4 \
-vf "fps=12,scale=640:-1:flags=lanczos" \
fragmento_640.gif
```
### Desde imagenes (secuencia de fotogramas)
```bash
ffmpeg -framerate 10 -i fotograma_%03d.png animacion.gif
ffmpeg -framerate 12 -i frame_%04d.jpg -loop 0 animacion_loop.gif
```
## Optimizar GIF con Gifsicle
Gifsicle reduce el tamano entre un 30-70% sin perdida visible.
```bash
# Instalar
sudo apt-get install gifsicle # Ubuntu
brew install gifsicle # macOS
# Optimizar
gifsicle -O3 --lossy=80 -i animacion.gif -o animacion_opt.gif
# --lossy=N: 30-100, mayor = mas pequeno
# --colors 128: reducir paleta a 128 colores
# Cambiar velocidad (delay en centesimas de segundo)
gifsicle --delay 10 animacion.gif -o animacion_10fps.gif
# Bucle infinito / sin bucle
gifsicle --loopcount=0 animacion.gif -o loop.gif
gifsicle --no-loopcount animacion.gif -o una_vez.gif
# Extraer fotograma
gifsicle animacion.gif '#0' > primer_fotograma.gif
gifsicle --info animacion.gif
```
## Crear GIF con Python (Pillow)
```python
from PIL import Image
import os
def gif_desde_carpeta(carpeta, salida, duracion=100, bucle=0):
exts = {'.png', '.jpg', '.jpeg', '.bmp', '.webp'}
archivos = sorted([
os.path.join(carpeta, f) for f in os.listdir(carpeta)
if os.path.splitext(f)[1].lower() in exts
])
frames = [Image.open(f).convert('RGBA') for f in archivos]
frames[0].save(
salida, format='GIF', save_all=True,
append_images=frames[1:], duration=duracion,
loop=bucle, optimize=True,
)
print(f"GIF: {salida} ({len(frames)} frames, {duracion}ms/frame)")
gif_desde_carpeta("frames/", "animacion.gif", duracion=80)
```
### Spinner de carga programatico
```python
from PIL import Image, ImageDraw
def crear_spinner(salida="spinner.gif", tam=100, n_frames=16):
frames = []
for i in range(n_frames):
img = Image.new('RGBA', (tam, tam), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
centro = tam // 2
radio = tam // 2 - 10
angulo = (360 / n_frames) * i
draw.arc(
[(centro-radio, centro-radio), (centro+radio, centro+radio)],
start=angulo, end=angulo+270,
fill=(59, 130, 246, 255), width=8
)
frames.append(img)
frames[0].save(
salida, save_all=True, append_images=frames[1:],
duration=60, loop=0, disposal=2,
)
crear_spinner()
```
## Convertir GIF a otros formatos
```bash
# GIF -> WebP animado (50% mas pequeno)
ffmpeg -i animacion.gif -c:v libwebp -loop 0 -quality 80 animacion.webp
# GIF -> MP4 (5-10x mas pequeno)
ffmpeg -i animacion.gif \
-c:v libx264 -pix_fmt yuv420p -movflags faststart \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
animacion.mp4
```
## GIF vs alternativas modernas
| Formato | Compresion | Transparencia | Compatibilidad |
|---|---|---|---|
| **GIF** | Mala (256 colores) | 1-bit | Universal |
| **WebP animado** | Excelente | Alpha real | Chrome/Firefox/Safari 14+ |
| **APNG** | Buena | Alpha real | Todos menos IE11 |
| **MP4/WebM** | Excelente | No | Universal |
**Recomendacion:** WebP animado con fallback GIF para web moderna. GIF puro para maxima compatibilidad.
## Conversion online
Para convertir videos a GIF o GIF a otros formatos sin instalar software, KaijuConverter lo hace directamente en el navegador.
Guía