Библиотека imaging для Go: ресайз и кроп изображений
В современной веб-разработке обработка изображений — одна из ключевых задач: от создания превью до адаптации картинок под разные разрешения экранов. Если вы пишете на Go (Golang) и ищете простой, но мощный инструмент для работы с изображениями, обратите внимание на библиотеку imaging. Она предоставляет удобный API для изменения размеров (resize), обрезки (crop), поворота, фильтрации и множества других операций.
Что такое imaging?
imaging — это популярная библиотека для Go, построенная на основе пакета image из стандартной библиотеки, но с гораздо более удобным интерфейсом. Она поддерживает форматы JPEG, PNG, GIF и BMP, а также позволяет выполнять операции с минимальным количеством кода. Главное преимущество — скорость работы и простота интеграции.
Установка
Для установки библиотеки выполните в терминале:
go get -u github.com/disintegration/imaging
После этого вы сможете импортировать её в свой проект:
import "github.com/disintegration/imaging"
Основные операции: resize и crop
1. Изменение размера (resize)
Функция imaging.Resize позволяет изменить размер изображения до указанных ширины и высоты. Если нужно сохранить пропорции, передайте 0 для одной из сторон — библиотека автоматически вычислит вторую.
Пример: ресайз до 300 пикселей по ширине
package main
import (
"github.com/disintegration/imaging"
)
func main() {
// Открываем изображение
img, err := imaging.Open("input.jpg")
if err != nil {
panic(err)
}
// Меняем ширину на 300px, высота подстраивается автоматически
resized := imaging.Resize(img, 300, 0, imaging.Lanczos)
// Сохраняем результат
err = imaging.Save(resized, "output_resized.jpg")
if err != nil {
panic(err)
}
}
В примере используется фильтр imaging.Lanczos — один из самых качественных для ресайза. Вы можете выбрать и другие: NearestNeighbor, Box, Linear, Gaussian и т.д.
2. Обрезка (crop)
Функция imaging.Crop вырезает прямоугольную область изображения. Ей нужно передать координаты верхнего левого угла, ширину и высоту области.
Пример: обрезка центральной части 200x200 пикселей
package main
import (
"github.com/disintegration/imaging"
)
func main() {
img, err := imaging.Open("input.jpg")
if err != nil {
panic(err)
}
// Вычисляем координаты для центральной обрезки
width := img.Bounds().Dx()
height := img.Bounds().Dy()
x := (width - 200) / 2
y := (height - 200) / 2
// Обрезаем
cropped := imaging.Crop(img, imaging.Rect(x, y, x+200, y+200))
err = imaging.Save(cropped, "output_cropped.jpg")
if err != nil {
panic(err)
}
}
Если вам нужно просто обрезать до квадрата по центру, используйте imaging.CropCenter:
croppedCenter := imaging.CropCenter(img, 200, 200)
Продвинутые возможности
Помимо базовых операций, imaging предлагает:
- Thumbnail — создание миниатюры с сохранением пропорций и заполнением фона.
- Rotate — поворот на произвольный угол.
- Flip — отражение по горизонтали или вертикали.
- Blur — размытие изображения.
- Sharpen — повышение резкости.
- Grayscale — преобразование в чёрно-белый формат.
Пример: создание миниатюры 150x150
thumbnail := imaging.Thumbnail(img, 150, 150, imaging.Lanczos)
imaging.Save(thumbnail, "thumb.jpg")
Функция Thumbnail сначала уменьшает изображение до указанных размеров, сохраняя пропорции, а затем центрирует и обрезает лишнее — идеально для аватарок.
Работа с разными форматами
Библиотека автоматически определяет формат по расширению файла при сохранении. Вы также можете явно задать качество JPEG:
err = imaging.Save(img, "output.jpg", imaging.JPEGQuality(80))
Для PNG можно настроить