使用 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 回答
img
的类型是&mut RgbImage
然后你接受另一个可变引用 . 那就是你试图将&mut &mut RgbImage
传递给draw_filled_circle_mut
,而它期望&mut RgbImage
.正确的版本
错误消息怎么样?让我们看一下函数的声明
该函数需要
&mut I
作为第一个参数,类型I
必须实现特征GenericImage
. 您将&mut &mut RgbImage
传递给函数,这意味着I
是&mut RgbImage
.编译器检查
&mut RgbImage
是否实现GenericImage
trait,发现它不是,并输出错误消息告诉它 .