Работа с изображениями в Go: resize и crop с библиотекой imaging

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

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

Начать курс

Библиотека 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 можно настроить

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