代码之家  ›  专栏  ›  技术社区  ›  wyc

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

  •  1
  • wyc  · 技术社区  · 3 年前

    我想合并两个图像。我正在使用 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 `()`
    

    我想编译器在说 图像::图像操作::覆盖 没有方法 save() ?如果是,我应该使用什么?

    Playground

    1 回复  |  直到 3 年前
        1
  •  5
  •   Dogbert    3 年前

    image::imageops::overlay 对作为第一个参数传递的图像进行变异,将第二个图像覆盖在其上,然后返回 () 。你需要打电话 .save() 在…上 img1 因为那个图像现在已经 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不会自动展开,因此您需要传递图像的完整路径。看见 this question


    创建 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();
    }
    
    推荐文章