使用image crate的overlay合并图片报错:unit type `()`无save方法
使用image crate的overlay合并图片时的save方法错误解决
我想要合并两张图片,使用image crate中的image::imageops::overlay编写了如下代码:
use image::imageops::overlay; use std::path::Path; fn main() { let path1 = Path::new("~/Desktop/to-merge/image1.png"); let path2 = Path::new("~/Desktop/to-merge/image2.png"); let mut img1 = image::open(&path1).unwrap().clone(); let mut img2 = image::open(&path2).unwrap().clone(); let output = overlay(&mut img1, &mut img2, 0, 0); let save_path = Path::new("~/Desktop/to-crop/merged.png"); output.save(save_path).unwrap(); }
执行cargo run后出现以下错误:
error[E0599]: no method named `save` found for unit type `()` in the current scope --> src/main.rs:11:12 | 11 | output.save(save_path).unwrap(); | ^^^^ method not found in `()`
我认为编译器提示image::imageops::overlay没有save()方法?如果是这样,我应该改用什么方法?
错误原因与解决办法
这个错误的核心是对overlay函数的作用逻辑理解有误:image::imageops::overlay是原地修改函数,它直接将第二张图片叠加到第一张图片上,所有修改都作用于传入的第一个可变引用参数(也就是img1),函数本身的返回值是()(空单元类型),并非新的图片对象。所以你将output绑定到这个空返回值后,调用save方法自然会报错。
修正后的代码如下:
use image::imageops::overlay; use std::path::Path; fn main() { let path1 = Path::new("~/Desktop/to-merge/image1.png"); let path2 = Path::new("~/Desktop/to-merge/image2.png"); // 直接绑定为可变变量,无需额外clone let mut img1 = image::open(&path1).unwrap(); // img2无需可变,overlay仅读取其数据 let img2 = image::open(&path2).unwrap(); // overlay原地修改img1,无需接收返回值 overlay(&mut img1, &img2, 0, 0); let save_path = Path::new("~/Desktop/to-crop/merged.png"); // 直接保存修改后的img1即可 img1.save(save_path).unwrap(); }
额外说明
- 原代码中的
clone是多余的,image::open返回的DynamicImage可以直接被可变借用,不需要克隆。 overlay的最后两个参数是叠加的起始坐标(x, y),当前代码设置为(0,0)表示从img1的左上角开始叠加。
内容的提问来源于stack exchange,提问作者wyc
相关产品推荐
相关产品推荐

