Работа с изображениями в Rust: resize и crop с библиотекой image

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

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

Начать курс

Работа с изображениями на 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(), но это выходит за

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