Работа с изображениями в Go (Golang): image, draw, imaging, resize

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

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

Начать курс

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

Go (Golang) предоставляет мощные встроенные средства для работы с растровой графикой, а также богатую экосистему сторонних библиотек. В этой статье мы рассмотрим как стандартные пакеты image, image/color, image/draw и image/png, так и популярные библиотеки imaging, resize и gg для решения типовых задач: загрузка, изменение размеров, наложение, рисование и сохранение изображений.

Стандартные пакеты Go для работы с изображениями

В стандартной библиотеке Go заложены базовые типы и функции для работы с изображениями, которые покрывают 80% повседневных задач.

  • image — определяет интерфейс Image и конкретные типы: RGBA, NRGBA, Gray, Paletted и др.
  • image/color — описывает цвета и цветовые модели (Color, RGBA, NRGBA, Gray).
  • image/draw — предоставляет алгоритмы рисования и наложения изображений (Porter-Duff compositing).
  • image/png, image/jpeg, image/gif — кодеки для чтения/записи соответствующих форматов.

Пример 1: Создание и сохранение PNG с градиентом

package main

import (
    "image"
    "image/color"
    "image/png"
    "os"
)

func main() {
    // Создаём новое RGBA-изображение 200x200
    width, height := 200, 200
    img := image.NewRGBA(image.Rect(0, 0, width, height))

    // Заливаем пиксели градиентом от красного к синему
    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            // Коэффициент от 0 до 1
            ratio := float64(x) / float64(width)
            r := uint8(255 * (1 - ratio))
            b := uint8(255 * ratio)
            g := uint8(128)
            img.Set(x, y, color.RGBA{r, g, b, 255})
        }
    }

    // Сохраняем в файл
    f, _ := os.Create("gradient.png")
    defer f.Close()
    png.Encode(f, img)
}

Пример 2: Загрузка JPEG, наложение текста (через image/draw)

package main

import (
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "image/png"
    "os"
)

func main() {
    // Открываем исходное изображение
    srcFile, _ := os.Open("input.jpg")
    defer srcFile.Close()
    src, _, _ := image.Decode(srcFile)

    // Создаём копию в RGBA для возможности рисования
    bounds := src.Bounds()
    dst := image.NewRGBA(bounds)
    draw.Draw(dst, bounds, src, bounds.Min, draw.Src)

    // Рисуем красный прямоугольник в левом верхнем углу
    redRect := image.NewUniform(color.RGBA{255, 0, 0, 200})
    rect := image.Rect(10, 10, 150, 80)
    draw.Draw(dst, rect, redRect, image.Point{}, draw.Over)

    // Сохраняем результат
    outFile, _ := os.Create("output.png")
    defer outFile.Close()
    png.Encode(outFile, dst)
}

Библиотека imaging: высокоуровневая обработка

imaging (github.com/disintegration/imaging) — это популярная библиотека, которая предоставляет удобный API для самых частых операций: изменение размера, обрезка, поворот, наложение фильтров и конвертация.

  • imaging.Open() — загрузка изображения из файла.
  • imaging.Resize() — изменение размера с сохранением пропорций.
  • imaging.Fit() — вписать в заданный прямоугольник.
  • imaging.Fill() — обрезать и масштабировать до точного размера.
  • imaging.Rotate() — поворот на заданный угол.
  • imaging.Blur(), imaging.Sharpen() — фильтры.

Пример 3: Изменение размера с помощью imaging

package main

import (
    "github.com/disintegration/imaging"
    "log"
)

func main() {
    // Открываем изображение
    src, err := imaging.Open("photo.jpg")
    if err != nil {
        log.Fatal(err)
    }

    // Изменяем размер до ширины 800px (высота автоматически)
    dst := imaging.Resize(src, 800,                    

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