1

我正在尝试使用 ndarray_image 从图像中获取 Array3:

pub fn from_png(path: &str) -> Result<Self, &str> {
        return match ndarray_image::open_image(path, Colors::Rgba) {
            Ok(data) => { ;
                let size = Size {
                        x: data.shape()[0],
                        y: data.shape()[1]
                    };
                Ok( Self { data, size } )
            }
            Err(_) => {
                Err("Unable to open image!")
            }
        }
    }

Self.data 类型是 Array3,open_image 返回一个 Array3。这很奇怪,但错误类型也相同:

error[E0308]: mismatched types
   |
   |                 Ok( Self { data, size } )
   |                            ^^^^ expected struct `ArrayBase`, found struct `ndarray::ArrayBase`
   |
   = note: expected struct `ArrayBase<OwnedRepr<u8>, Dim<[usize; 3]>>`
              found struct `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 3]>>`
   = note: perhaps two different versions of crate `ndarray` are being used?

关于版本:我对所有 ndarray-* crate 使用版本“0”。

Cargo.toml 中的依赖项:

[dependencies]
bytes = "1.1.0"
font-kit = "0.10.1"
pathfinder_geometry = "0.5.1"
image = "0.23.14"
rayon = "1.5.1"
ndarray = { version="0", features=["rayon", "serde"]}
serde = "1.0.133"
serde_json = "1.0.74"
ndarray-stats = "0"
ndarray-image = "0"
4

1 回答 1

3

这是我ndarray在整个依赖关系树中得到的内容:

$ cargo tree | grep ndarray
├── ndarray v0.15.4
├── ndarray-image v0.3.0
│   └── ndarray v0.14.0
├── ndarray-stats v0.5.0
│   ├── ndarray v0.15.4 (*)

如您所见,确实有两个不兼容的版本ndarray- 一个被拉入ndarray-image,另一个被ndarray-stats.

原因是 Cargo 不会尝试根据它们的依赖关系解析直接依赖版本。它所知道的只是你已经0.x.y为每个请求了一些版本ndarray-*,所以它选择了最新的版本——它们碰巧不能一起使用。


要使其工作,您必须将您的版本降级ndarray到其他依赖项可用的最低版本,即0.14.

对于直接依赖,这就像明确要求所需的版本一样简单。
对于ndarray-stats,我们必须翻阅以前的版本寻找它们的依赖关系;令人高兴的是,这在crate 页面上有明确记录:我们正在寻找的版本是0.4.0.
还建议将次要版本ndarray-image也固定,以便在更新时不会意外再次出现损坏。

现在,对应的部分Cargo.toml如下所示:

ndarray = { version="0.14", features=["rayon", "serde"]}
ndarray-stats = "0.4"
ndarray-image = "0.3"

的输出cargo tree是这样的:

$ cargo tree | grep ndarray
├── ndarray v0.14.0
├── ndarray-image v0.3.0
│   └── ndarray v0.14.0 (*)
├── ndarray-stats v0.4.0
│   ├── ndarray v0.14.0 (*)

我无法按原样检查您的代码,因为它不是MRE,但在进行了这些更改之后,它应该可以编译 - 如果您使用了来自ndarray v0.15.

于 2022-01-11T11:02:30.127 回答