---
name: thumbnail_generate
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: impure
signature: "func ThumbnailGenerate(srcPath string, dstPath string, maxWidth int, maxHeight int) error"
description: "Lee una imagen JPEG o PNG, la redimensiona manteniendo aspect ratio para que quepa en (maxWidth, maxHeight) y la guarda en dstPath. Solo soporta entrada/salida JPEG y PNG."
tags: [image, thumbnail, resize, file, upload, infra]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [fmt, image, image/jpeg, image/png, os, path/filepath, strings]
params:
  - name: srcPath
    desc: "ruta de la imagen original (JPEG o PNG)"
  - name: dstPath
    desc: "ruta destino del thumbnail (extension determina formato de salida: .jpg/.jpeg/.png)"
  - name: maxWidth
    desc: "ancho maximo del thumbnail en pixeles (>0)"
  - name: maxHeight
    desc: "alto maximo del thumbnail en pixeles (>0)"
output: "nil si el thumbnail se genero correctamente, error si falla la lectura, decode, encode o si la extension no es soportada"
tested: true
tests: ["genera thumbnail JPEG mas pequeno que el original", "preserva aspect ratio", "rechaza extension de salida no soportada", "no agranda imagenes ya pequenas"]
test_file_path: "functions/infra/thumbnail_generate_test.go"
file_path: "functions/infra/thumbnail_generate.go"
---

## Ejemplo

```go
err := ThumbnailGenerate("./uploads/photo.jpg", "./uploads/thumbs/photo.jpg", 200, 200)
if err != nil {
    log.Fatal(err)
}
```

## Notas

Implementacion solo con stdlib (`image`, `image/jpeg`, `image/png`). Resize nearest-neighbor: rapido y sin dependencias, pero baja calidad. Para apps que necesiten thumbnails de alta calidad usar `golang.org/x/image/draw` con `BiLinear` o `CatmullRom`.

NO soporta WebP, AVIF, HEIC ni GIF. Si la imagen original ya es mas pequena que (maxWidth, maxHeight), se guarda sin redimensionar (no se agranda).
