Introdução ao trabalho com imagens em Go
Go (Golang) é uma linguagem compilada moderna com uma rica biblioteca padrão, que inclui o pacote image para trabalho básico com imagens raster. No entanto, para tarefas de redimensionamento, filtragem, conversão de formatos e processamento em lote, bibliotecas de terceiros são frequentemente necessárias. Neste artigo, exploraremos as ferramentas mais populares para trabalhar com imagens em Go, forneceremos exemplos de código e compararemos suas funcionalidades.
Pacote padrão image
O pacote image da biblioteca padrão do Go fornece tipos e funções básicas para decodificar, codificar e manipular imagens. Ele suporta os formatos PNG, JPEG e GIF (apenas decodificação). Exemplo de carregamento de imagem de um arquivo:
package main
import ( "image" "image/jpeg" "os")
func main() { file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close()
img, _, err := image.Decode(file) if err != nil { panic(err) }
// Acesso aos pixels via img.At(x, y) _ = img}Limitações do pacote padrão: ausência de funções embutidas para redimensionamento, rotação, filtragem e trabalho com dados EXIF. Para essas tarefas, utilize bibliotecas de terceiros.
Biblioteca imaging
imaging é uma das bibliotecas mais populares para processamento de imagens em Go. Ela oferece uma API simples para redimensionamento, corte, rotação, aplicação de filtros e conversão de formatos.
Instalação:
go get github.com/disintegration/imagingExemplo de redimensionamento mantendo a proporção:
package main
import ( "github.com/disintegration/imaging" "log")
func main() { src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("Erro ao abrir: %v", err) }
// Redimensionar para largura de 800px, altura ajustada automaticamente dst := imaging.Resize(src, 800, 0, imaging.Lanczos)
err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("Erro ao salvar: %v", err) }}A biblioteca suporta filtros: desfoque, nitidez, contraste, brilho, tons de cinza. Exemplo de aplicação de filtro:
grayscaleImg := imaging.Grayscale(src)sharpImg := imaging.Sharpen(src, 0.5)blurImg := imaging.Blur(src, 3.0)Vantagens: API limpa, suporte a GIF (somente leitura), orientação automática por EXIF, funções embutidas para miniaturas e processamento em lote.
Biblioteca nfnt/resize
nfnt/resize é uma biblioteca especializada em redimensionamento de imagens. Ela oferece vários algoritmos de interpolação (NearestNeighbor, Bilinear, Bicubic, MitchellNetravali, Lanczos2, Lanczos3).
Instalação:
go get github.com/nfnt/resizeExemplo de redimensionamento para exatos 200x200 pixels:
package main
import ( "image/jpeg" "os" "github.com/nfnt/resize")
func main() { file, _ := os.Open("input.jpg") defer file.Close() img, _ := jpeg.Decode(file)
// Redimensionar para 200x200 newImg := resize.Resize(200, 200, img, resize.Lanczos3)
out, _ := os.Create("resized.jpg") defer out.Close() jpeg.Encode(out, newImg, nil)}Características: a biblioteca funciona apenas com imagens que implementam a interface image.Image. Não suporta leitura/gravação direta de arquivos — é necessário decodificar/codificar manualmente.
Também na biblioteca
GraphQL em Node.js: Guia Completo da Biblioteca graphql-http
Internacionalização (i18n) em Go (Golang): Guia Completo