Работа с изображениями в Go (Golang): библиотеки и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в 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,                    

Рекомендаций