首页 文章

在函数中使用`draw_filled_circle_mut`:trait bound不满意

提问于
浏览
1

使用 imageproc crate,我可以在图像上调用 draw_filled_circle_mut

let mut img = ImageBuffer::from_pixel(640, 480, Rgb([255, 0, 0]));
draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([0, 255, 0]));

但是,如果我使用一个函数它不起作用:

fn circle(img: &mut RgbImage) {
    draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([0, 255, 0]));
}

fn main() {
    let mut img = ImageBuffer::from_pixel(640, 480, Rgb([255, 0, 0]));
    circle(&mut img);
}

它返回此错误:

error[E0277]: the trait bound `&mut image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<u8>>: image::GenericImage` is not satisfied
  --> src/main.rs:84:5
   |
84 |     draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([10,255,10]));
   |     ^^^^^^^^^^^^^^^^^^^^^^ the trait `image::GenericImage` is not implemented for `&mut image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<u8>>`
   |
   = help: the following implementations were found:
         <image::ImageBuffer<P, Container> as image::GenericImage>
   = note: required by `imageproc::drawing::draw_filled_circle_mut`

我仍然迷失在这种错误中 . 我以为我可以画 RgbImage 这是一个 ImageBuffer<Rgb<u8>, Vec<u8>> 这就是我的 img var(除非我不明白) .

那么为什么它在同一个函数中工作(没有实际写入类型)并且当我使用另一个函数(带有类型参数)时它不起作用?

1 回答

  • 2
    fn circle(img: &mut RgbImage) {
        draw_filled_circle_mut(&mut img, ...
    

    img 的类型是 &mut RgbImage 然后你接受另一个可变引用 . 那就是你试图将 &mut &mut RgbImage 传递给 draw_filled_circle_mut ,而它期望 &mut RgbImage .

    正确的版本

    fn circle(img: &mut RgbImage) {
        draw_filled_circle_mut(img, (300, 300), 50, Rgb([0, 255, 0]));
    }
    

    错误消息怎么样?让我们看一下函数的声明

    pub fn draw_filled_circle_mut<I>(
        image: &mut I, 
        center: (i32, i32), 
        radius: i32, 
        color: I::Pixel
    ) 
    where
        I: GenericImage,
        I::Pixel: 'static, 
    

    该函数需要 &mut I 作为第一个参数,类型 I 必须实现特征 GenericImage . 您将 &mut &mut RgbImage 传递给函数,这意味着 I&mut RgbImage .

    编译器检查 &mut RgbImage 是否实现 GenericImage trait,发现它不是,并输出错误消息告诉它 .

相关问题