Работа с изображениями в 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