我正在像这样使用piston Rust image library(版本0.10.3):
extern crate image;
use std::f32;
use std::fs::File;
use std::path::Path;
use image::GenericImage;
use image::Pixels;
use image::Pixel;
fn init(input_path: &str) {
let mut img = image::open(&Path::new(input_path)).unwrap();
let img_width = img.dimensions().0;
let img_height = img.dimensions().1;
for p in img.pixels() { println!("pixel: {}", p.2.channel_count()); }
}
fn main() {
init("file.png");
}
本示例失败,并显示一条错误消息
error: no method named `channel_count` found for type `image::Rgba<u8>` in the current scope
--> src/main.rs:20:55
|
20 | for p in img.pixels() { println!("pixel: {}", p.2.channel_count()); }
| ^^^^^^^^^^^^^
<std macros>:2:27: 2:58 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
src/main.rs:20:29: 20:72 note: in this expansion of println! (defined in <std macros>)
|
= note: found the following associated functions; to be used as methods, functions must have a `self` parameter
note: candidate #1 is defined in the trait `image::Pixel`
--> src/main.rs:20:55
|
20 | for p in img.pixels() { println!("pixel: {}", p.2.channel_count()); }
| ^^^^^^^^^^^^^
<std macros>:2:27: 2:58 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
src/main.rs:20:29: 20:72 note: in this expansion of println! (defined in <std macros>)
据我所知,这是真的,因为文档中提到了我想拥有的方法是Pixel trait的一部分-文档并没有真正弄清楚如何访问从现有图像加载的缓冲区中的单个像素,它主要是在谈论关于从
ImageBuffer
获取像素。如何遍历图像中的所有像素并从中获取rgb/其他值?
编辑:在阅读源代码之后,我通过调用
Pixel::channels(&self)
并接受&self
来解决此问题,因此我发现这必须是通过trait添加到实现Pixel的对象的方法。因此,
channel_count()
的签名既没有参数,也没有&self
。我应该怎么称呼这个方法? 最佳答案
您尝试调用的函数channel_count()
是静态方法。它是为一种类型定义的,而不是为该类型的对象定义的。你叫它
Rgba::channel_count()
或者
<Rgba<u8> as Pixel>::channel_count()
因为第一种形式可能会由于缺少类型信息而失败(在这种情况下)。
但是,我认为它不会满足您的需求。它应该只返回
4
数,因为它是Rgba
拥有的 channel 数。要获得所需的RGB值,请查看具有该类型的文档
Rgba
。它有一个公共(public)成员
data
(它是一个4元素的数组),并且实现了Index
。如果
pixel
的类型为Rgba<u8>
(对应于p.2
),则可以通过调用pixel.data
来获取想要的值,该值将以数组的形式提供给您,或者通过建立索引。例如,pixel[0]
将为您提供红色值。关于image-processing - 如何在Rust中从图像读取像素值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40518713/