Введение в работу с изображениями на 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 Также в библиотеке
Сериализация объектов в C++: библиотеки, методы и примеры кода
Event Bus и паттерн Observer в C++: реализация и примеры