使用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(除非我不明白)。
那么为什么它在同一个函数中工作(没有实际写入类型)并且当我使用另一个函数(带有类型参数)时它不起作用?
答案 0 :(得分: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
特征,发现它不是,并输出错误消息告诉它。