如何从Rust中的图像中读取像素值

时间:2016-11-10 01:34:10

标签: image-processing rust

我正在使用piston Rust image library(版本0.10.3),如下所示:

window.onhashchange

此示例失败并显示错误消息

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");
}

我理解的是真的,因为文档提到我想要的方法是Pixel trait的一部分 - 文档并没有真正说明如何访问从中加载的缓冲区中的单个像素现有图片,主要讨论从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>) 获取像素。

如何迭代图像中的所有像素并从中获取rgb /其他值?

编辑:在阅读完源代码之后,我通过调用ImageBuffer调用Pixel::channels(&self)来解决这个问题,因此我发现这必须是通过特征添加到实现Pixel的对象的方法。

因此&self的签名既没有参数也没有channel_count()。我怎么称呼这种方法?

1 个答案:

答案 0 :(得分:0)

您尝试呼叫的功能channel_count()是一种静态方法。它是为类型定义的,而不是为该类型的对象定义的。你用

来称呼它
Rgba::channel_count()

<Rgba<u8> as Pixel>::channel_count()

因为缺少类型信息,第一种形式可能会失败(在这种情况下)。

然而,我认为它不会给你你想要的东西。它应该只返回4数字,因为它是Rgba所拥有的频道数。

要获得您想要的RGB值,请查看您所拥有类型的文档Rgba

它有一个公共成员data,它是一个4元素数组,它实现了Index

如果pixel类型为Rgba<u8>(与您的p.2相对应),则可以通过调用pixel.data来获取您所寻求的值,一个数组,或通过索引。例如,pixel[0]会为您提供红色值。