在当前作用域中找不到单元类型"()"的名为"save"的方法



我想合并两个图像。我使用的是图片箱中的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();
}

相关内容

  • 没有找到相关文章