在 Rust 中处理图像:从加载到滤镜
Rust 是一种现代系统语言,不仅在 Web 开发和系统编程中越来越受欢迎,在多媒体处理领域也是如此。凭借其高性能和安全性,Rust 非常适合处理图像相关的任务。在本文中,我们将介绍关键库和工具,它们能够高效地处理位图图形。
主要库:image
image 库是 Rust 生态系统中处理图像的事实标准。它支持数十种格式(PNG、JPEG、GIF、BMP、WebP、TIFF 等),并提供了用于加载、处理和保存图像的便捷 API。
安装 — 在 Cargo.toml 中添加:
[dependencies]image = "0.25"加载和保存图像
我们来看一下基本操作:打开文件、调整大小并保存为其他格式。
use image::{DynamicImage, GenericImageView};use std::path::Path;
fn main() { // 加载图像 let img = image::open("input.jpg").expect("无法打开文件");
// 输出信息 println!("尺寸: {}x{}", img.width(), img.height()); println!("色彩模式: {:?}", img.color());
// 调整大小为 200x200(保持比例) let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);
// 保存为 PNG resized.save("output.png").expect("保存错误");}基本处理操作
image 库提供了 imageops 模块,其中包含一组现成的滤镜和变换。
- 旋转和翻转:
use image::DynamicImage;
fn rotate_and_flip(img: &DynamicImage) { // 顺时针旋转 90 度 let rotated = img.rotate90(); // 水平翻转 let flipped = img.fliph(); // 垂直翻转 let flipped_v = img.flipv();}- 裁剪:
fn crop_example(img: &DynamicImage) { // 裁剪矩形:x=50, y=30, 宽度=200, 高度=150 let cropped = img.crop_imm(50, 30, 200, 150); cropped.save("cropped.png").unwrap();}- 调整亮度和对比度:
fn adjust_brightness(img: &DynamicImage) { // 增加亮度 50(值可以为负) let brighter = image::imageops::brighten(img, 50); // 增加对比度 let contrasted = image::imageops::contrast(img, 1.5);}滤镜和效果
该库包含几个内置滤镜。以下是一些最有用的示例:
use image::imageops::FilterType;
fn apply_filters(img: &DynamicImage) { // 高斯模糊(sigma = 2.0) let blurred = image::imageops::blur(img, 2.0);
// 锐化 let sharpened = image::imageops::unsharpen(img, 5.0, 2);
// 转换为灰度 let gray = img.grayscale();
// 应用阈值滤镜(二值化) let threshold = image::imageops::threshold(img, 128);
// 保存所有结果 blurred.save("blurred.png").unwrap(); sharpened.save("sharpened.png").unwrap(); gray.save("gray.png").unwrap();}直接操作像素
如果您需要完全控制每个像素,该库允许访问原始数据:
use image::Rgba;
fn pixel_manipulation(mut img: image::RgbaImage) { for pixel in img.pixels_mut() { // 反转颜色 pixel[0] = 255 - pixel[0]; // 红色 pixel[1] = 255 - pixel[1];