在 Rust 中处理图像:使用 image 库进行 resize 和 crop
Rust 是一种现代系统编程语言,在需要高性能和安全性的任务中越来越受欢迎。图像处理就是这样的任务之一。在本文中,我们将详细介绍如何使用强大且方便的 image 库在 Rust 中调整图像大小 (resize) 和裁剪 (crop) 图像。您将学习如何安装该库、加载图像、应用变换以及保存结果。
安装和引入 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) 以及区域的宽度和高度。重要提示:坐标和尺寸不得超出原始图像的边界,否则会导致 panic。
裁剪尺寸为 300x200 的中心部分的示例:
fn crop_example() -> Result<(), Box<dyn std::error::Error>> { let img = open("input.jpg")?; let (width, height) = img.dimensions()