0

我正在使用活塞的image箱子,代码如下:

use image::{Rgb, ImageBuffer, Pixel};

let image = Vec::<Rgb<u8>>::new();

let image_buffer = ImageBuffer::<Rgb<u8>, Vec<Rgb<u8>>>::from_vec(
    width, height
    image,
).unwrap();

但是我收到此错误:

error[E0599]: no function or associated item named `from_vec` found for type `image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<image::Rgb<u8>>>` in the current scope
   --> src/main.rs:348:21
    |
348 |     let image_buffer = ImageBuffer::<Rgb<u8>, Vec<Rgb<u8>>>::from_vec(
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function or associated item not found in `image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<image::Rgb<u8>>>`

我不知道为什么。它在文档中很清楚,据我所知,这些类型似乎是正确的。

4

2 回答 2

3

扩展一点:在上面的例子中,我们有一个ImageBuffer::<Rgb<u8>, Vec<Rgb<u8>>. 并根据其类型参数ImageBuffer提供两种实现:from_vec

impl<P, Container> ImageBuffer<P, Container>
where
    P: Pixel<Subpixel = u8> + 'static,
    Container: Deref<Target = [u8]>, 
impl<P: Pixel + 'static> ImageBuffer<P, Vec<P::Subpixel>>
where
    P::Subpixel: 'static, 

这些都不起作用,因为Container参数类型 inImageBuffer<Rgb<u8>, Vec<Rgb<u8>>是一个Rgb<u8>值向量。它将取消对 的切片的引用[Rgb<u8>],使其与第一个实现不兼容,而第二个实现需要一个子像素值向量 ( <P as Pixel>::Subpixel) 而不是实际像素值 ( Rgb<u8>)。这通常是ImageBuffer此 crate 中的类型所期望的像素数据容器。

工作示例:

extern crate image;

use image::{ImageBuffer, Pixel, Rgb};

fn main() {
    let width = 64;
    let height = 64;
    let image = vec![0x7F_u8; width as usize * height as usize * 3];

    let image_buffer =
        ImageBuffer::<Rgb<u8>, Vec<u8>>::from_vec(width, height, image).unwrap();
}

操场

于 2018-11-08T17:30:56.120 回答
0

啊,它必须是 a Vec<P::Subpixel>,即Vec<u8>而不是 a Vec<Rgb<u8>>。这有点烦人。

于 2018-11-08T17:18:16.743 回答