在 Rust 中处理图像:image、photon-rs 及其他库

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

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

开始课程

在 Rust 中处理图像:库、工具与实践示例



Rust 是一种现代系统编程语言,越来越多地被用于图形和图像处理任务。凭借其高性能、内存安全性和丰富的 crate 生态系统,Rust 非常适合构建图像处理工具:从简单的格式转换器到复杂的滤镜和计算机视觉算法。



在本文中,我们将介绍 Rust 中用于图像处理的关键库,探讨它们的功能,并提供可运行的代码示例。



主要的图像处理库



Rust 生态系统提供了几个成熟的图像处理 crate。其中最流行的有:



  • image — 用于加载、保存和基本图像转换的基础库。支持 PNG、JPEG、GIF、BMP、ICO、TIFF 等格式。
  • photon-rs — 用于应用照片滤镜和特效的高性能库。可在 Rust 和 WebAssembly 上运行。
  • imageproc — image 的扩展,提供高级算法:霍夫变换、分割、形态学操作。
  • rusttype — 用于处理字体和在图像上渲染文本的库。


安装与配置



在 Cargo.toml 文件中添加依赖:



[dependencies]image = "0.25"photon-rs = "0.3"imageproc = "0.25"


加载、调整大小和保存图像



从一个基础示例开始——加载图像,将其缩小一半,并以另一种格式保存。



use image::{DynamicImage, GenericImageView, ImageFormat};use std::fs::File;

fn main() -> Result<(), Box<dyn std::error::Error>> { // 加载图像 let img = image::open("input.jpg")?; println!("尺寸: {} x {}", img.width(), img.height());

// 缩放至原始尺寸的一半 let resized = img.resize_exact( img.width() / 2, img.height() / 2, image::imageops::FilterType::Lanczos3 );

// 以 PNG 格式保存 let mut output = File::create("output.png")?; resized.write_to(&mut output, ImageFormat::Png)?;

println!("完成!已保存为 output.png"); Ok(())}


使用 photon-rs 应用照片滤镜



photon-rs 库允许快速应用滤镜、调整颜色和添加特效。



use photon_rs::PhotonImage;use photon_rs::transform::resize;use photon_rs::filters::filter;

fn main() { // 打开图像 let mut img = photon_rs::open_image("input.jpg");

// 应用“棕褐色”滤镜 filter(&mut img, "sepia", 1.0);

// 调整亮度 photon_rs::channels::brighten(&mut img, 30);

// 调整大小 let resized = resize(&img, 800, 600, photon_rs::transform::SamplingFilter::Nearest);

// 保存结果 photon_rs::save_image(resized, "output_photon.jpg"); println!("滤镜已应用,已保存至 output_photon.jpg");}


像素操作与绘图



有时需要直接操作像素或绘制基本图形。为此,我们将 image 与 imageproc 结合使用。



use image::{RgbImage, Rgb};use imageproc::drawing::draw_filled_circle_mut;

fn main() { // 创建一个 400x300 的空白图像,背景为白色 let mut img = RgbImage::new(400, 300);

// 将背景填充为浅蓝色 for pixel in img.pixels_mut() { *pixel = Rgb([200, 220, 255]); }

// 绘制一个红色圆形 (x=200, y=150, 半径=80) draw_filled_circle_mut( &mut img,\

推荐