作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 image-rs (0.23.12) 库来实现一些基本的图像分析功能,通过学习 Rust(我来自 Javascript/Python 背景)。我通过 image-rs 为此目的提供的迭代器访问像素数据。这是一个函数的最小示例,它接受对图像子区域 (image::SubImage
) 的引用并遍历其中的像素,并与每个像素进行比较。
(游乐场link)
extern crate image;
use image::{GenericImageView, SubImage, ImageBuffer, Luma};
fn main() {
let grey_image = ImageBuffer::new(300, 200);
let subimg = grey_image.view(100, 100, 20, 20);
find_dark_pixels(&subimg);
}
fn find_dark_pixels(img: &SubImage<&ImageBuffer<Luma<u8>, Vec<u8>>>)
{
static WHITE: Luma<u8> = Luma([255]);
let mut pixel_iter = img.pixels();
if pixel_iter.any(|(_, _, pixel)| pixel != WHITE) {
println!("Found dark pixels!");
}
}
(
image::Luma
是一个单色像素。)这个非通用版本的函数编译和运行得很好。但是,它确实需要参数是
SubImage
没有别的了。不是很有用 - 它确实需要根据需要对整个图像或一个子集进行操作。允许这样做的特征是
GenericImageView
,以及 Image 和
SubImage
实现它。
fn find_dark_pixels<I: GenericImageView>(img: &I)
这从编译器中得出:
binary operation `!=` cannot be applied to type `<I as GenericImageView>::Pixel`
the trait `std::cmp::PartialEq` is not implemented for `<I as GenericImageView>::Pixel` rustc(E0369)
image-rs 中的像素类型确实实现了
PartialEq
,所以我告诉编译器:
fn find_dark_pixels<I: GenericImageView>(img: &I)
where <I as GenericImageView>::Pixel: std::cmp::PartialEq
(the rest is unchanged)
然后它提示闭包中的“像素”和“白色”的类型不匹配:
mismatched types
expected associated type `<I as GenericImageView>::Pixel`
found struct `Luma<u8>`
consider constraining the associated type `<I as GenericImageView>::Pixel` to `Luma<u8>`
for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html rustc(E0308)
我遵循(我相信?)编译器的建议并将函数签名更改为:
fn find_dark_pixels<I: GenericImageView>(img: &I)
where <I as GenericImageView>::Pixel: Luma<u8>
(the rest is unchanged)
编译器计数器:
expected trait, found struct `Luma`
not a trait rustc(E0404)
在这一点上,我尝试以各种方式注释“像素”和“白色”,但我认为自己被难住了。你知道,我也知道,Luma 实现了比较所需的一切
pixel != WHITE
,但我不知道如何说服 rustc。
ImageBuffers
类型的
Luma<u8>, Vec<u8>
- 我只需要使用单色图像。但它确实需要使用任何(不可变的) ImageView 。)
最佳答案
编译器关于“将关联类型 <T as Trait>::Associated
限制为 Concrete
”的建议意味着您需要直接在 trait bound 中为关联类型请求具体类型。这是通过 Trait<Associated = Concrete>
完成的。语法 - 例如约束 I
对于产生字符串的迭代器,你可以写 I: Iterator<Item = String>
.在 find_dark_pixels
的情况下你会要求 Pixel
关联类型为 Luma<u8>
如下:
fn find_dark_pixels<I: GenericImageView<Pixel = Luma<u8>>>(img: &I) {
关于generics - 使此函数通用时如何满足特征界限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65674750/
我试图在 for 循环中更新我的 for 循环的上限。 例子 numvar = 3 for i=2 To numvar Step 2 'code... numvar = numvar
给定f(x, y)和g(n): def f(x, y): if x < 1 or y < 1: return 1 return f(x - 1, y - 1) + f(
我是一名优秀的程序员,十分优秀!