Работа с изображениями в Rust: от загрузки до фильтрации
Rust — современный системный язык, который набирает популярность не только в веб-разработке и системном программировании, но и в области обработки мультимедиа. Благодаря своей производительности и безопасности, Rust отлично подходит для задач, связанных с изображениями. В этой статье мы рассмотрим ключевые библиотеки и инструменты, которые позволяют эффективно работать с растровой графикой.
Основная библиотека: image
Библиотека image — это де-факто стандарт для работы с изображениями в экосистеме Rust. Она поддерживает десятки форматов (PNG, JPEG, GIF, BMP, WebP, TIFF и другие) и предоставляет удобный API для загрузки, обработки и сохранения изображений.
Установка — добавьте в Cargo.toml:
[dependencies]
image = "0.25"
Загрузка и сохранение изображений
Рассмотрим базовые операции: открыть файл, изменить размер и сохранить в другом формате.
use image::{DynamicImage, GenericImageView};
use std::path::Path;
fn main() {
// Загружаем изображение
let img = image::open("input.jpg").expect("Не удалось открыть файл");
// Выводим информацию
println!("Размер: {}x{}", img.width(), img.height());
println!("Цветовой режим: {:?}", img.color());
// Изменяем размер до 200x200 (с сохранением пропорций)
let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);
// Сохраняем в PNG
resized.save("output.png").expect("Ошибка сохранения");
}
Основные операции обработки
Библиотека image предоставляет модуль imageops с набором готовых фильтров и трансформаций.
- Поворот и отражение:
use image::DynamicImage;
fn rotate_and_flip(img: &DynamicImage) {
// Поворот на 90 градусов по часовой стрелке
let rotated = img.rotate90();
// Отражение по горизонтали
let flipped = img.fliph();
// Отражение по вертикали
let flipped_v = img.flipv();
}
- Обрезка (crop):
fn crop_example(img: &DynamicImage) {
// Обрезаем прямоугольник: x=50, y=30, ширина=200, высота=150
let cropped = img.crop_imm(50, 30, 200, 150);
cropped.save("cropped.png").unwrap();
}
- Изменение яркости и контрастности:
fn adjust_brightness(img: &DynamicImage) {
// Увеличиваем яркость на 50 (значение может быть отрицательным)
let brighter = image::imageops::brighten(img, 50);
// Увеличиваем контраст
let contrasted = image::imageops::contrast(img, 1.5);
}
Фильтры и эффекты
Библиотека включает несколько встроенных фильтров. Вот примеры наиболее полезных:
use image::imageops::FilterType;
fn apply_filters(img: &DynamicImage) {
// Размытие по Гауссу (sigma = 2.0)
let blurred = image::imageops::blur(img, 2.0);
// Увеличение резкости
let sharpened = image::imageops::unsharpen(img, 5.0, 2);
// Преобразование в оттенки серого
let gray = img.grayscale();
// Применение порогового фильтра (бинаризация)
let threshold = image::imageops::threshold(img, 128);
// Сохраняем все результаты
blurred.save("blurred.png").unwrap();
sharpened.save("sharpened.png").unwrap();
gray.save("gray.png").unwrap();
}
Работа с пикселями напрямую
Если вам нужен полный контроль над каждым пикселем, библиотека позволяет получить доступ к сырым данным:
use image::Rgba;
fn pixel_manipulation(mut img: image::RgbaImage) {
for pixel in img.pixels_mut() {
// Инвертируем цвета
pixel[0] = 255 - pixel[0]; // Red
pixel[1] = 255 - pixel[1]; // Green
pixel[2] = 255 - pixel[2]; // Blue
// Альфа-канал оставляем без изменений
}
img.save("inverted.png").unwrap();
}
Дополнительные библиотеки
Помимо image, в экосистеме Rust есть и другие полезные инструменты:
imageproc— расширение дляimageс продвинутыми алгоритмами: обнаружение границ (Canny, Sobel), морфология, сегментация.