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

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

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

Начать курс

Введение в работу с изображениями на Go

Go (Golang) — современный компилируемый язык с богатой стандартной библиотекой, которая включает пакет image для базовой работы с растровыми изображениями. Однако для задач масштабирования, фильтрации, конвертации форматов и пакетной обработки часто требуются сторонние библиотеки. В этой статье мы рассмотрим наиболее популярные инструменты для работы с изображениями в Go, приведём примеры кода и сравним их возможности.

Стандартный пакет image

Пакет image из стандартной библиотеки Go предоставляет базовые типы и функции для декодирования, кодирования и манипуляции изображениями. Он поддерживает форматы PNG, JPEG и GIF (только декодирование). Пример загрузки изображения из файла:

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)
    }

    // Доступ к пикселям через img.At(x, y)
    _ = img
}

Ограничения стандартного пакета: отсутствие встроенных функций изменения размера, поворота, фильтрации и работы с EXIF-данными. Для этих задач используйте сторонние библиотеки.

Библиотека imaging

imaging — одна из самых популярных библиотек для обработки изображений на Go. Она предоставляет простой API для изменения размера, обрезки, поворота, наложения фильтров и конвертации форматов.

Установка:

go get github.com/disintegration/imaging

Пример изменения размера с сохранением пропорций:

package main

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

func main() {
    src, err := imaging.Open("input.jpg")
    if err != nil {
        log.Fatalf("Ошибка открытия: %v", err)
    }

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

    err = imaging.Save(dst, "output.jpg")
    if err != nil {
        log.Fatalf("Ошибка сохранения: %v", err)
    }
}

Библиотека поддерживает фильтры: размытие, резкость, контраст, яркость, оттенки серого. Пример наложения фильтра:

grayscaleImg := imaging.Grayscale(src)
sharpImg := imaging.Sharpen(src, 0.5)
blurImg := imaging.Blur(src, 3.0)

Преимущества: чистый API, поддержка GIF (только для чтения), автоматическая ориентация по EXIF, встроенные функции для миниатюр и пакетной обработки.

Библиотека nfnt/resize

nfnt/resize — узкоспециализированная библиотека для изменения размера изображений. Она предлагает несколько алгоритмов интерполяции (NearestNeighbor, Bilinear, Bicubic, MitchellNetravali, Lanczos2, Lanczos3).

Установка:

go get github.com/nfnt/resize

Пример изменения размера до точных 200x200 пикселей:

package main

import (
    "image/jpeg"
    "os"
    "github.com/nfnt/resize"
)

func main() {
    file, _ := os.Open("input.jpg")
    defer file.Close()
    img, _ := jpeg.Decode(file)

    // Изменение размера до 200x200
    newImg := resize.Resize(200, 200, img, resize.Lanczos3)

    out, _ := os.Create("resized.jpg")
    defer out.Close()
    jpeg.Encode(out, newImg, nil)
}

Особенности: библиотека работает только с изображениями, реализующими интерфейс image.Image. Не поддерживает чтение/запись файлов напрямую — требуется ручное декодирование/кодирование.

Библиотека golang.org/x/image

Расширение стандартной библиотеки от команды Go — golang.org/x/image. Включает дополнительные форматы (BMP, TIFF, WebP — только декодирование), а также утилиты для работы с цветами и шрифтами.

Установка:

go get golang.org/x/image

Пример декодирования BMP:

package main

import (
    "golang.org/x/image/bmp"
    "image/jpeg"
    "os"
)

func main() {
    src, _ := os.Open("input.bmp")
    defer                    

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