Работа с изображениями в Rust: библиотека image и не только

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

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

Начать курс

Работа с изображениями в 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), морфология, сегментация.

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