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

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

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

Начать курс

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

Rust — современный системный язык программирования, который набирает популярность в областях, требующих высокой производительности и надёжности. Обработка изображений не исключение: экосистема Rust предлагает несколько зрелых библиотек для загрузки, обработки, конвертации и анализа изображений. В этой статье мы рассмотрим основные инструменты: image, fast_image_resize и photon-rs, а также приведём примеры кода для типовых задач.

Основная библиотека: image

Крейт image (версия 0.25.x) — де-факто стандарт для работы с изображениями в Rust. Он поддерживает чтение и запись множества форматов: PNG, JPEG, BMP, GIF, TIFF, WebP и другие. Библиотека предоставляет удобные структуры данных для представления изображений (DynamicImage, RgbImage, GrayImage) и широкий набор операций: изменение размера, обрезка, поворот, фильтры, преобразование цветовых пространств.

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

use image::{DynamicImage, GenericImageView, imageops::FilterType};

fn resize_image(input_path: &str, output_path: &str, new_width: u32, new_height: u32) {
    let img = image::open(input_path).expect("Не удалось открыть изображение");
    let resized = img.resize_exact(new_width, new_height, FilterType::Lanczos3);
    resized.save(output_path).expect("Не удалось сохранить изображение");
    println!("Изображение изменено и сохранено в {}", output_path);
}

fn main() {
    resize_image("input.jpg", "output.png", 800, 600);
}

Библиотека image также поддерживает работу с пикселями напрямую. Например, можно получить доступ к каждому пикселю и изменить его цвет:

use image::{GenericImage, Rgba};

fn invert_colors(path: &str) {
    let mut img = image::open(path).expect("Ошибка открытия");
    for (x, y, pixel) in img.enumerate_pixels_mut() {
        let inverted = Rgba([
            255 - pixel[0],
            255 - pixel[1],
            255 - pixel[2],
            pixel[3],
        ]);
        img.put_pixel(x, y, inverted);
    }
    img.save("inverted.png").unwrap();
}

Высокопроизводительное изменение размера: fast_image_resize

Если ваша задача — многократное изменение размера изображений с максимальной скоростью, обратите внимание на крейт fast_image_resize. Он использует SIMD-инструкции (SSE, AVX2, NEON) и оптимизированные алгоритмы (Lanczos, Catmull-Rom, Mitchell). Библиотека работает непосредственно с сырыми массивами пикселей, что минимизирует накладные расходы.

Пример использования fast_image_resize:

use fast_image_resize as fr;
use image::GenericImageView;

fn resize_fast(input_path: &str, output_path: &str, new_width: u32, new_height: u32) {
    // Загружаем изображение через image
    let img = image::open(input_path).expect("Ошибка открытия");
    let (width, height) = img.dimensions();
    let rgba = img.to_rgba8();

    // Создаём представление для fast_image_resize
    let src_view = fr::ImageView::new(&rgba, width, height, fr::PixelType::U8x4);
    let mut dst_image = fr::Image::new(new_width, new_height, fr::PixelType::U8x4);
    let mut dst_view = dst_image.view_mut();

    // Настройка ресайзера
    let mut resizer = fr::Resizer::new(fr::ResizeAlg::Convolution(fr::FilterType::Lanczos3));
    resizer.resize(&src_view, &mut dst_view).expect("Ошибка ресайза");

    // Сохраняем результат через image
    let result_img = image::RgbaImage::from_raw(new_width, new_height, dst_image.into_vec()).unwrap();
    result_img.save(output_path).unwrap();
}

По тестам, fast_image_resize может быть в 2-5 раз быстрее стандартного ресайза из image, особенно при больших размерах изображений.

Универсальный фоторедактор: photon-rs

Крейт photon-rs — это высокоуровневая библиотека для обработки изображений, вдохновлённая инструментами вроде Photoshop. Она предоставляет готовые функции для коррекции цвета, наложения фильтров, добавления эффектов (сепия, размытие, резкость) и изменения освещения. Библиотека также поддерживает работу с несколькими изображениями одновременно и имеет WASM-совместимость.

Пример применения фильтра сепия и изменения яркости:

use photon_rs::helpers::*;
use photon_rs::transform::*;
use photon_rs::                    

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