Немного расшифровавшись: в приведенном выше примере у нас есть 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();
}
Детская площадка