首页 > 解决方案 > 使用图像箱时如何获得 u8 RGB 值的向量?

问题描述

我需要拍摄图像并获取 RGB 字节值列表。我正在使用图像箱。这就是我所拥有的:

extern crate image;

fn main() {
    let im = image::open("wall.jpg").unwrap().to_rgb();
    let data: Vec<[u8; 3]> = im.pixels().flat_map(|p| vec![p.data]).collect();
    let rgb: Vec<&u8> = data.iter().flat_map(|p| p.iter()).collect();
    println!("First Pixel: {} {} {}", rgb[0], rgb[1], rgb[2]);
}

这看起来很丑陋。我必须引入一个中间变量,并得到一个指向我真正需要的值的指针向量,所以在我可以做其他事情之前,我必须再次映射它以获得实际值。

我想要的只是一个向量u8。我怎么得到它?

标签: rust

解决方案


从 0.23.12 开始,to_rgb已弃用DynamicImage::to_rgb8DynamicImage::to_bytes改为:

let im = image::open("wall.jpg").unwrap().to_rgb8();
let rgb: Vec<u8> = im.into_raw();

// Alternatively
let bytes = image::open("wall.jpg").unwrap().to_bytes();

在 0.23.12 之前,如果您只想要原始数据本身,您可以调用DynamicImage::raw_pixels

let im = image::open("wall.jpg").unwrap().to_rgb();
let rgb: Vec<u8> = im.raw_pixels();

如果您真正感兴趣的只是第一个像素,我建议您致电GenericImage::get_pixel

let im = image::open("wall.jpg").unwrap();
let first_pixel = im.get_pixel(0, 0);

然后您可以将其转换[u8; 3]为 RGB 数据数组:

let rgb = first_pixel.to_rbg();
println!("First Pixel: {} {} {}", rgb.data[0], rgb.data[1], rgb.data[2]);

推荐阅读