Работа с изображениями в 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, Также в библиотеке
Генератор QR-кодов на Java: библиотека ZXing (Zebra Crossing)
Chalk для JavaScript (Node.js): полное руководство с примерами
better-sqlite3-typescript для TypeScript: полное руководство с примерами
Glide/Coil для Kotlin: полное руководство с примерами
Мониторинг Node.js: инструменты и библиотеки для отслеживания производительности