Работа с изображениями в 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:: Также в библиотеке
Event Bus и паттерн Observer в Rust: реализация событийной архитектуры
WebSocket библиотеки Java: Полное руководство по реализации реального времени
Интернационализация (i18n) в Rust: библиотека gettext-rs и fluent-rs
Работа с изображениями в Swift: полное руководство для iOS и macOS