我想合并两个图像。我使用的是图片箱中的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()
?如果是,我应该使用什么?
游乐场
image::imageops::overlay
对作为第一个参数传递的图像进行变异,将第二个图像叠加在其上,并返回()
。您需要在img1
上调用.save()
,因为该图像上现在覆盖了img2
。此外,您不需要将对img2
的可变引用传递给overlay
,并且.clone()
调用是不必要的。
use image::imageops::overlay;
use std::path::Path;
fn main() {
let path1 = Path::new("~/Desktop/to-crop/image1.png");
let path2 = Path::new("~/Desktop/to-crop/image2.png");
let mut img1 = image::open(&path1).unwrap();
let img2 = image::open(&path2).unwrap();
overlay(&mut img1, &img2, 0, 0);
let save_path = Path::new("~/Desktop/to-crop/merged.png");
img1.save(save_path).unwrap();
}
此外,Rust不会自动扩展~
,因此您需要将完整路径传递给图像。请参阅此问题。
创建Path
也是不必要的,因为这两个函数都接受P: AsRef<Path>
,这意味着您可以直接传递&str
:
use image::imageops::overlay;
use std::path::Path;
fn main() {
let path1 = "~/Desktop/to-crop/image1.png";
let path2 = "~/Desktop/to-crop/image2.png";
let mut img1 = image::open(&path1).unwrap();
let img2 = image::open(&path2).unwrap();
overlay(&mut img1, &img2, 0, 0);
let save_path = "~/Desktop/to-crop/merged.png";
img1.save(save_path).unwrap();
}