Работа с изображениями в Rust: image, photon-rs и другие библиотеки

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

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

Начать курс

Работа с изображениями в Rust: библиотеки, инструменты и практические примеры

Rust — современный системный язык программирования, который всё чаще используется для задач, связанных с обработкой графики и изображений. Благодаря высокой производительности, безопасной работе с памятью и богатой экосистеме крейтов, Rust отлично подходит для создания инструментов обработки изображений: от простых конвертеров форматов до сложных фильтров и алгоритмов компьютерного зрения.

В этой статье мы рассмотрим ключевые библиотеки для работы с изображениями в Rust, разберём их возможности и приведём рабочие примеры кода.

Основные библиотеки для работы с изображениями

Экосистема Rust предлагает несколько зрелых крейтов для обработки изображений. Самые популярные из них:

  • image — фундаментальная библиотека для загрузки, сохранения и базовых преобразований изображений. Поддерживает PNG, JPEG, GIF, BMP, ICO, TIFF и другие форматы.
  • photon-rs — высокопроизводительная библиотека для применения фотофильтров и эффектов. Работает на Rust и WebAssembly.
  • imageproc — расширение для image, предоставляющее продвинутые алгоритмы: преобразования Хафа, сегментацию, морфологические операции.
  • rusttype — библиотека для работы со шрифтами и рендеринга текста на изображениях.

Установка и подключение

Добавьте зависимости в файл Cargo.toml:

[dependencies]
image = "0.25"
photon-rs = "0.3"
imageproc = "0.25"

Загрузка, изменение размера и сохранение изображения

Начнём с базового примера — загрузим изображение, уменьшим его вдвое и сохраним в другом формате.

use image::{DynamicImage, GenericImageView, ImageFormat};
use std::fs::File;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Загружаем изображение
    let img = image::open("input.jpg")?;
    println!("Размер: {} x {}", img.width(), img.height());

    // Масштабируем до половины исходного размера
    let resized = img.resize_exact(
        img.width() / 2,
        img.height() / 2,
        image::imageops::FilterType::Lanczos3
    );

    // Сохраняем в формате PNG
    let mut output = File::create("output.png")?;
    resized.write_to(&mut output, ImageFormat::Png)?;

    println!("Готово! Сохранено как output.png");
    Ok(())
}

Применение фотофильтров с photon-rs

Библиотека photon-rs позволяет быстро накладывать фильтры, корректировать цвета и добавлять эффекты.

use photon_rs::PhotonImage;
use photon_rs::transform::resize;
use photon_rs::filters::filter;

fn main() {
    // Открываем изображение
    let mut img = photon_rs::open_image("input.jpg");

    // Применяем фильтр "сепия"
    filter(&mut img, "sepia", 1.0);

    // Изменяем яркость
    photon_rs::channels::brighten(&mut img, 30);

    // Изменяем размер
    let resized = resize(&img, 800, 600, photon_rs::transform::SamplingFilter::Nearest);

    // Сохраняем результат
    photon_rs::save_image(resized, "output_photon.jpg");
    println!("Фильтр применён, сохранено в output_photon.jpg");
}

Работа с пикселями и рисование

Иногда требуется напрямую манипулировать пикселями или рисовать примитивы. Для этого используем image в связке с imageproc.

use image::{RgbImage, Rgb};
use imageproc::drawing::draw_filled_circle_mut;

fn main() {
    // Создаём пустое изображение 400x300 с белым фоном
    let mut img = RgbImage::new(400, 300);

    // Закрашиваем фон в светло-голубой
    for pixel in img.pixels_mut() {
        *pixel = Rgb([200, 220, 255]);
    }

    // Рисуем красный круг (x=200, y=150, радиус=80)
    draw_filled_circle_mut(
        &mut img,
        (200, 150),
        80,
        Rgb([255, 0, 0])
    );

    // Сохраняем
    img.save("circle.png").unwrap();
    println!("Круг нарисован, сохранено в circle.png");
}

Конвертация форматов и работа с метаданными

Rust позволяет легко конвертировать изображения между форматами, а также читать базовые метаданные.

use image::{GenericImageView, ImageFormat};
use std::path::Path;

fn main() -> Result<(), Box                    

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