Trabalho com imagens em Go (Golang): visão geral das bibliotecas e exemplos práticos
Go (Golang) é uma linguagem compilada, estaticamente tipada, que está ganhando popularidade no desenvolvimento web, microsserviços e tarefas relacionadas ao processamento de dados. Ao contrário do Python, onde tradicionalmente se usa OpenCV ou Pillow para trabalhar com imagens, Go possui várias bibliotecas leves e rápidas que permitem realizar operações básicas com gráficos raster: redimensionamento, corte, rotação, aplicação de filtros e desenho.
Neste artigo, veremos três das bibliotecas mais populares para trabalhar com imagens em Go: imaging, nfnt/resize e gg. Você aprenderá como instalá-las e verá exemplos de código para tarefas típicas.
1. Biblioteca imaging
imaging é uma biblioteca simples, mas poderosa, para processamento de imagens. Ela fornece funções convenientes para redimensionamento, corte, rotação, aplicação de filtros (desfoque, nitidez, inversão de cores) e salvamento em vários formatos (JPEG, PNG, GIF, BMP).
Instalação
go get -u github.com/disintegration/imagingExemplo: redimensionamento e corte
package main
import ( "fmt" "github.com/disintegration/imaging" "log")
func main() { // Abrir a imagem src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("Erro ao abrir o arquivo: %v", err) }
// Redimensionar para 800x600, mantendo a proporção dst := imaging.Resize(src, 800, 600, imaging.Lanczos) // Cortar a região central de 400x400 dst = imaging.CropCenter(dst, 400, 400)
// Aplicar filtro de desfoque dst = imaging.Blur(dst, 3.0)
// Salvar o resultado err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("Erro ao salvar: %v", err) } fmt.Println("Imagem processada e salva como output.jpg")}A biblioteca suporta vários filtros: imaging.Grayscale, imaging.Invert, imaging.Contrast, imaging.Sharpen e outros. Todos funcionam "prontos para uso".
2. Biblioteca nfnt/resize
Se sua tarefa é apenas redimensionar imagens com máxima performance, nfnt/resize é a melhor escolha. Ela é otimizada para processamento de alta velocidade e suporta vários algoritmos de interpolação (NearestNeighbor, Bilinear, Bicubic, Lanczos2, Lanczos3).
Instalação
go get -u github.com/nfnt/resizeExemplo: redimensionamento com 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) }
// Redimensionar para largura de 300 pixels, altura calculada automaticamente m := resize.Resize(300, 0, img, resize.Lanczos3)
out, err := os.Create("resized.jpg") if err != nil { log.Fatal(err) } defer out.Close()
// Salvar com qualidade JPEG 90% err = jpeg.Encode(out, m, &jpeg.Options{Quality: 90}) if err != nil { log.Fatal(err) } log.Println("Imagem reduzida para largura de 300px")}Esta biblioteca não fornece funções para corte ou filtros, mas sua velocidade e minimalismo a tornam ideal para servidores que precisam processar milhares de imagens por segundo.
3. Biblioteca gg (drawing)
gg é uma biblioteca para desenho de gráficos 2D, semelhante ao cairo ou Pillow Draw. Ela permite criar imagens