функция или связанный элемент не найден для изображения :: ImageBuffer :: from_vec () - PullRequest
0 голосов
/ 08 ноября 2018

Я использую ящик Piston's 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>>>`

Я не могу понять, почему. Это ясно в документации , и типы, насколько я могу судить, кажутся правильными.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Немного расшифровавшись: в приведенном выше примере у нас есть 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 в ImageBuffer<Rgb<u8>, Vec<Rgb<u8>> является вектором значений Rgb<u8>. Он будет разыменовываться со срезом [Rgb<u8>], что делает его несовместимым с первой реализацией, а вторая ожидает вектор значений подпикселей (<P as Pixel>::Subpixel), а не фактических значений пикселей (Rgb<u8>) , Обычно это то, что тип ImageBuffer в этом ящике ожидает в качестве контейнера данных пикселей.

Рабочий пример:

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();
}

Детская площадка

0 голосов
/ 08 ноября 2018

Ах, это должно быть Vec<P::Subpixel>, т.е. Vec<u8>, а не Vec<Rgb<u8>>. Это немного раздражает.

...