在 Rust 中处理图像:使用 image 库进行 resize 和 crop

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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()                    

推荐