Работа с изображениями в Go (Golang): обзор библиотек и практические примеры
Go (Golang) — это компилируемый, статически типизированный язык, который набирает популярность в веб-разработке, микросервисах и задачах, связанных с обработкой данных. В отличие от Python, где для работы с изображениями традиционно используется OpenCV или Pillow, в Go есть несколько легковесных и быстрых библиотек, которые позволяют выполнять основные операции с растровой графикой: изменение размера, обрезку, поворот, наложение фильтров и рисование.
В этой статье мы рассмотрим три наиболее популярные библиотеки для работы с изображениями на Go: imaging, nfnt/resize и gg. Вы узнаете, как их установить, и увидите примеры кода для типовых задач.
1. Библиотека imaging
imaging — это простая, но мощная библиотека для обработки изображений. Она предоставляет удобные функции для изменения размера, обрезки, поворота, применения фильтров (размытие, резкость, инверсия цветов) и сохранения в различных форматах (JPEG, PNG, GIF, BMP).
Установка
go get -u github.com/disintegration/imaging
Пример: изменение размера и обрезка
package main
import (
"fmt"
"github.com/disintegration/imaging"
"log"
)
func main() {
// Открываем изображение
src, err := imaging.Open("input.jpg")
if err != nil {
log.Fatalf("Ошибка открытия файла: %v", err)
}
// Изменяем размер до 800x600, сохраняя пропорции
dst := imaging.Resize(src, 800, 600, imaging.Lanczos)
// Обрезаем центральную область 400x400
dst = imaging.CropCenter(dst, 400, 400)
// Применяем фильтр размытия
dst = imaging.Blur(dst, 3.0)
// Сохраняем результат
err = imaging.Save(dst, "output.jpg")
if err != nil {
log.Fatalf("Ошибка сохранения: %v", err)
}
fmt.Println("Изображение обработано и сохранено как output.jpg")
}
Библиотека поддерживает множество фильтров: imaging.Grayscale, imaging.Invert, imaging.Contrast, imaging.Sharpen и другие. Все они работают «из коробки».
2. Библиотека nfnt/resize
Если ваша задача — только изменение размера изображений с максимальной производительностью, nfnt/resize — лучший выбор. Она оптимизирована для высокоскоростной обработки и поддерживает различные алгоритмы интерполяции (NearestNeighbor, Bilinear, Bicubic, Lanczos2, Lanczos3).
Установка
go get -u github.com/nfnt/resize
Пример: изменение размера с разными алгоритмами
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)
}
// Изменяем размер до ширины 300 пикселей, высота вычисляется автоматически
m := resize.Resize(300, 0, img, resize.Lanczos3)
out, err := os.Create("resized.jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()
// Сохраняем с качеством JPEG 90%
err = jpeg.Encode(out, m, &jpeg.Options{Quality: 90})
if err != nil {
log.Fatal(err)
}
log.Println("Изображение уменьшено до ширины 300px")
}
Эта библиотека не предоставляет функций для обрезки или фильтров, но её скорость и минимализм делают её идеальной для серверов, где нужно обрабатывать тысячи изображений в секунду.
3. Библиотека gg (drawing)
gg — это библиотека для рисования 2D-графики, похожая на cairo или Pillow Draw. Она позволяет создавать изображения с нуля, рисовать линии, прямоугольники, круги, текст, применять градиенты и трансформации.
Установка
go get -u github.com/fogleman/gg
Пример: создание изображения с текстом и фигурами
package main
import (
"github.com/fogleman/gg"
"log"
)
func main() {
// Создаём холст 800x600
dc := gg.NewContext(800, 600)
// Заливаем фон белым
dc.SetRGB(1,