Trabajo con imágenes en Go (Golang): image, draw, imaging, resize

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con imágenes en Go (Golang): desde lo básico hasta herramientas avanzadas



Go (Golang) proporciona potentes herramientas integradas para trabajar con gráficos rasterizados, así como un rico ecosistema de bibliotecas de terceros. En este artículo, veremos tanto los paquetes estándar image, image/color, image/draw y image/png, como las bibliotecas populares imaging, resize y gg para resolver tareas típicas: carga, cambio de tamaño, superposición, dibujo y guardado de imágenes.



Paquetes estándar de Go para trabajar con imágenes



En la biblioteca estándar de Go se incluyen tipos y funciones básicas para trabajar con imágenes que cubren el 80% de las tareas cotidianas.



  • image — define la interfaz Image y tipos concretos: RGBA, NRGBA, Gray, Paletted, entre otros.
  • image/color — describe colores y modelos de color (Color, RGBA, NRGBA, Gray).
  • image/draw — proporciona algoritmos de dibujo y superposición de imágenes (composición Porter-Duff).
  • image/png, image/jpeg, image/gif — códecs para leer/escribir los formatos correspondientes.


Ejemplo 1: Crear y guardar un PNG con degradado



package main

import ( "image" "image/color" "image/png" "os")

func main() { // Creamos una nueva imagen RGBA de 200x200 width, height := 200, 200 img := image.NewRGBA(image.Rect(0, 0, width, height))

// Rellenamos los píxeles con un degradado de rojo a azul for y := 0; y < height; y++ { for x := 0; x < width; x++ { // Coeficiente de 0 a 1 ratio := float64(x) / float64(width) r := uint8(255 * (1 - ratio)) b := uint8(255 * ratio) g := uint8(128) img.Set(x, y, color.RGBA{r, g, b, 255}) } }

// Guardamos en un archivo f, _ := os.Create("gradient.png") defer f.Close() png.Encode(f, img)}


Ejemplo 2: Cargar un JPEG, superponer texto (mediante image/draw)



package main

import ( "image" "image/color" "image/draw" "image/jpeg" "image/png" "os")

func main() { // Abrimos la imagen original srcFile, _ := os.Open("input.jpg") defer srcFile.Close() src, _, _ := image.Decode(srcFile)

// Creamos una copia en RGBA para poder dibujar bounds := src.Bounds() dst := image.NewRGBA(bounds) draw.Draw(dst, bounds, src, bounds.Min, draw.Src)

// Dibujamos un rectángulo rojo en la esquina superior izquierda redRect := image.NewUniform(color.RGBA{255, 0, 0, 200}) rect := image.Rect(10, 10, 150, 80) draw.Draw(dst, rect, redRect, image.Point{}, draw.Over)

// Guardamos el resultado outFile, _ := os.Create("output.png") defer outFile.Close() png.Encode(outFile, dst)}


Biblioteca imaging: procesamiento de alto nivel



imaging (github.com/disintegration/imaging) es una biblioteca popular que proporciona una API conveniente para las operaciones más comunes: cambio de tamaño, recorte, rotación, aplicación de filtros y conversión.



  • imaging.Open() — carga una imagen desde un archivo.
  • imaging.Resize() — cambia el tamaño manteniendo la proporción.
  • imaging.Fit() — ajusta la imagen dentro de un rectángulo dado.
  • imaging.Fill() — recorta y escala a un tamaño exacto.
  • imaging.Rotate() — rota la imagen un ángulo dado.
  • imaging.Blur(), imaging.Sharpen() — filtros.


Ejemplo 3: Cambio de tamaño con

Recommendations