Trabajo con imágenes en Go (Golang): visión general de bibliotecas y ejemplos prácticos
Go (Golang) es un lenguaje compilado, de tipado estático, que está ganando popularidad en el desarrollo web, microservicios y tareas relacionadas con el procesamiento de datos. A diferencia de Python, donde tradicionalmente se usa OpenCV o Pillow para trabajar con imágenes, en Go existen varias bibliotecas ligeras y rápidas que permiten realizar operaciones básicas con gráficos rasterizados: cambio de tamaño, recorte, rotación, aplicación de filtros y dibujo.
En este artículo, analizaremos las tres bibliotecas más populares para trabajar con imágenes en Go: imaging, nfnt/resize y gg. Aprenderá cómo instalarlas y verá ejemplos de código para tareas típicas.
1. Biblioteca imaging
imaging es una biblioteca simple pero potente para el procesamiento de imágenes. Proporciona funciones convenientes para cambiar el tamaño, recortar, rotar, aplicar filtros (desenfoque, nitidez, inversión de colores) y guardar en varios formatos (JPEG, PNG, GIF, BMP).
Instalación
go get -u github.com/disintegration/imagingEjemplo: cambio de tamaño y recorte
package main
import ( "fmt" "github.com/disintegration/imaging" "log")
func main() { // Abrimos la imagen src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("Error al abrir el archivo: %v", err) }
// Cambiamos el tamaño a 800x600, manteniendo la proporción dst := imaging.Resize(src, 800, 600, imaging.Lanczos) // Recortamos el área central de 400x400 dst = imaging.CropCenter(dst, 400, 400)
// Aplicamos un filtro de desenfoque dst = imaging.Blur(dst, 3.0)
// Guardamos el resultado err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("Error al guardar: %v", err) } fmt.Println("Imagen procesada y guardada como output.jpg")}La biblioteca admite múltiples filtros: imaging.Grayscale, imaging.Invert, imaging.Contrast, imaging.Sharpen y otros. Todos funcionan "de fábrica".
2. Biblioteca nfnt/resize
Si su tarea es solo cambiar el tamaño de las imágenes con el máximo rendimiento, nfnt/resize es la mejor opción. Está optimizada para el procesamiento de alta velocidad y admite varios algoritmos de interpolación (NearestNeighbor, Bilinear, Bicubic, Lanczos2, Lanczos3).
Instalación
go get -u github.com/nfnt/resizeEjemplo: cambio de tamaño con diferentes algoritmos
package main
import ( "image" "image/jpeg" "log" "os" "github.com/nfnt/resize")
func main() { file, err := os.Open("input.jpg") if err != nil { log.Fatal(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { log.Fatal(err) }
// Cambiamos el tamaño a un ancho de 300 píxeles, la altura se calcula automáticamente m := resize.Resize(300, 0, img, resize.Lanczos3)
out, err := os.Create("resized.jpg") if err != nil { log.Fatal(err) } defer out.Close()
// Guardamos con calidad JPEG al 90% err = jpeg.Encode(out, m, &jpeg.Options{Quality: 90}) if err != nil { log.Fatal(err) } log.Println("Imagen reducida a un ancho de 300px")}Esta biblioteca no proporciona funciones para recortar o aplicar filtros, pero su velocidad y minimalismo la hacen ideal para servidores que necesitan procesar miles de imágenes por segundo.
3. Biblioteca gg (dibujo)
gg es una biblioteca para dibujar gráficos 2D, similar a cairo o Pillow Draw. Permite crear imágenes