Trabalho com imagens em Rust: redimensionar e cortar com a biblioteca image

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalho com imagens em Rust: redimensionar e cortar com a biblioteca image

\n\n

Rust é uma linguagem de programação de sistemas moderna que está ganhando popularidade em tarefas que exigem alto desempenho e segurança. Uma dessas tarefas é o processamento de imagens. Neste artigo, veremos detalhadamente como redimensionar (resize) e cortar (crop) imagens em Rust usando a poderosa e conveniente biblioteca image. Você aprenderá como instalar a biblioteca, carregar uma imagem, aplicar transformações e salvar o resultado.

\n\n

Instalação e inclusão da biblioteca image

\n\n

A biblioteca image é o padrão de facto para trabalhar com imagens raster no ecossistema Rust. Ela suporta vários formatos (PNG, JPEG, GIF, BMP, WEBP e outros) e fornece um amplo conjunto de funções para processamento.

\n\n

Para começar, adicione a dependência no arquivo Cargo.toml:

\n\n
[dependencies]\nimage = "0.25"
\n\n

Depois disso, você pode importar os módulos necessários no código:

\n\n
use std::path::Path;\nuse image::{open, DynamicImage, GenericImageView, imageops::FilterType};
\n\n

Carregamento e salvamento de imagens

\n\n

O primeiro passo é carregar uma imagem de um arquivo. A biblioteca detecta automaticamente o formato pela extensão. Vejamos um exemplo básico:

\n\n
fn main() -> Result<(), Box<dyn std::error::Error>> {\n    // Carregamos a imagem\n    let img = open("input.jpg")?;\n    println!("Tamanho: {:?}", img.dimensions());\n    // Salvamos em outro formato\n    img.save("output.png")?;\n    Ok(())\n}
\n\n

O método open() retorna um DynamicImage — uma enumeração que pode armazenar a imagem em um de vários formatos internos (RGB8, RGBA8, Gray8, etc.). O método dimensions() retorna uma tupla (u32, u32) — largura e altura.

\n\n

Redimensionamento (resize)

\n\n

A função resize() recebe uma nova largura, altura e o tipo de filtro. O filtro afeta a qualidade do resultado e a velocidade de execução. Aqui estão os principais filtros:

\n\n
    \n
  • Nearest — rápido, mas com baixa qualidade (pixelização).
  • \n
  • Lanczos3 — alta qualidade, porém mais lento.
  • \n
  • CatmullRom — bom equilíbrio entre velocidade e qualidade.
  • \n
  • Gaussian — desfoca a imagem ao reduzir.
  • \n
\n\n

Exemplo de redimensionamento para 800x600 pixels:

\n\n
use image::imageops::FilterType;\n\nfn resize_example() -> Result<(), Box<dyn std::error::Error>> {\n    let img = open("input.jpg")?;\n    let resized = img.resize(800, 600, FilterType::Lanczos3);\n    resized.save("resized.jpg")?;\n    println!("Novo tamanho: {:?}", resized.dimensions());\n    Ok(())\n}
\n\n

Se precisar manter as proporções, use resize_to_fill() (preenche a área, cortando o excesso) ou resize_to_fit() (encaixa nas dimensões especificadas, adicionando espaços vazios). Exemplo:

\n\n
// Encaixar em um retângulo 400x400, mantendo as proporções\nlet fitted = img.resize_to_fit(400, 400, FilterType::CatmullRom);\nfitted.save("fitted.jpg")?;\n\n// Preencher o retângulo 400x400, cortando as bordas\nlet filled = img.resize_to_fill(400, 400, FilterType::Lanczos3);\nfilled.save("filled.jpg")?;
\n\n

Corte de imagem (crop)

\n\n

O corte é realizado com o método crop(), que recebe as coordenadas do canto superior esquerdo (x, y), bem como a largura e a altura da área. Importante: as coordenadas e dimensões não devem ultrapassar os limites da imagem original, caso contrário ocorrerá um pânico.

\n\n

Exemplo de corte da parte central com tamanho 300x200:

\n\n
fn crop_example() -> Result<(), Box<dyn std::error::Error>> {\n    let img = open("input.jpg")?;\n    let (width, height) = img.dimensions()                    

Recommendations