Работа с изображениями на Rust: resize и crop с библиотекой image
Rust — современный системный язык программирования, который набирает популярность в задачах, требующих высокой производительности и безопасности. Одной из таких задач является обработка изображений. В этой статье мы подробно рассмотрим, как изменять размер (resize) и обрезать (crop) изображения на Rust с помощью мощной и удобной библиотеки image. Вы узнаете, как установить библиотеку, загрузить изображение, применить трансформации и сохранить результат.
Установка и подключение библиотеки image
Библиотека image — это де-факто стандарт для работы с растровыми изображениями в экосистеме Rust. Она поддерживает множество форматов (PNG, JPEG, GIF, BMP, WEBP и другие) и предоставляет широкий набор функций для обработки.
Чтобы начать, добавьте зависимость в файл Cargo.toml:
[dependencies]
image = "0.25"
После этого вы можете импортировать необходимые модули в коде:
use std::path::Path;
use image::{open, DynamicImage, GenericImageView, imageops::FilterType};
Загрузка и сохранение изображений
Первый шаг — загрузить изображение из файла. Библиотека автоматически определит формат по расширению. Рассмотрим базовый пример:
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Загружаем изображение
let img = open("input.jpg")?;
println!("Размер: {:?}", img.dimensions());
// Сохраняем в другом формате
img.save("output.png")?;
Ok(())
}
Метод open() возвращает DynamicImage — перечисление, которое может хранить изображение в одном из нескольких внутренних форматов (RGB8, RGBA8, Gray8 и т.д.). Метод dimensions() возвращает кортеж (u32, u32) — ширину и высоту.
Изменение размера (resize)
Функция resize() принимает новую ширину, высоту и тип фильтра. Фильтр влияет на качество результата и скорость выполнения. Вот основные фильтры:
- Nearest — быстрый, но с низким качеством (пикселизация).
- Lanczos3 — высокое качество, но медленнее.
- CatmullRom — хороший баланс скорости и качества.
- Gaussian — размывает изображение при уменьшении.
Пример изменения размера до 800x600 пикселей:
use image::imageops::FilterType;
fn resize_example() -> Result<(), Box<dyn std::error::Error>> {
let img = open("input.jpg")?;
let resized = img.resize(800, 600, FilterType::Lanczos3);
resized.save("resized.jpg")?;
println!("Новый размер: {:?}", resized.dimensions());
Ok(())
}
Если нужно сохранить пропорции, используйте resize_to_fill() (заполняет область, обрезая лишнее) или resize_to_fit() (вписывает в заданные размеры, добавляя пустые поля). Пример:
// Вписать в прямоугольник 400x400, сохраняя пропорции
let fitted = img.resize_to_fit(400, 400, FilterType::CatmullRom);
fitted.save("fitted.jpg")?;
// Заполнить прямоугольник 400x400, обрезая края
let filled = img.resize_to_fill(400, 400, FilterType::Lanczos3);
filled.save("filled.jpg")?;
Обрезка изображения (crop)
Обрезка выполняется с помощью метода crop(), который принимает координаты левого верхнего угла (x, y), а также ширину и высоту области. Важно: координаты и размеры не должны выходить за пределы исходного изображения, иначе возникнет паника.
Пример обрезки центральной части размером 300x200:
fn crop_example() -> Result<(), Box<dyn std::error::Error>> {
let img = open("input.jpg")?;
let (width, height) = img.dimensions();
// Вычисляем координаты центра
let x = (width - 300) / 2;
let y = (height - 200) / 2;
let cropped = img.crop(x, y, 300, 200);
cropped.save("cropped.jpg")?;
println!("Обрезано: {:?}", cropped.dimensions());
Ok(())
}
Для более сложных сценариев (например, обрезка по кругу или многоугольнику) потребуется работа с пикселями напрямую через get_pixel() и put_pixel(), но это выходит за
Также в библиотеке
OAuth клиент для Java: обзор библиотек и примеры кода
Машинное обучение на Java: обзор основных библиотек для разработки
OAuth клиент для C# (.NET): реализация авторизации через сторонние сервисы
Swagger/OpenAPI генерация для PHP: лучшие инструменты и библиотеки
Авторизация и аутентификация в Rust: библиотеки и инструменты