我正在尝试渲染图像。我编写了一个put_pixel
函数,将RGBA像素写入表示图像的数组中。
图像是一维数组,其中包含i8
个值(每个字节都是颜色的一部分)。我想一步来写颜色。
fn put_pixel(x: u16, y: u16, color: u32, width: u16, height: u16, buffer: &[u8]) {
let index = 0; // I'll calculate the right index later.
buffer[index] as u32 = color; // I want to write the color here.
}
所以,这给了我一个错误,说
45 | buffer[index] = color;
| ^^^^^ expected u8, found u32
听起来很合理,但是我不知道如何将像素“投射”到阵列中。
答案 0 :(得分:4)
听起来很合理,但是我不知道如何将像素“投射”到阵列中。
将u8
的引用转换为u32
的引用是不安全的。而且,如果编译器允许您将类型u32
的值分配给u8
,则它可能没有按预期的方式工作,因为该值必须被截断为单个组件,以便它将适合单个切片元素。
话虽如此,通常使用byteorder
从切片或其他二进制数据流中读取和写入此类类型。
use byteorder::{LittleEndian, WriteBytesExt};
fn put_pixel(x: u16, y: u16, color: u32, width: u16, height: u16, buffer: &mut [u8]) {
let index = unimplemented!();
buffer[index..].write_u32::<LittleEndian>(color).unwrap();
}
答案 1 :(得分:3)
答案 2 :(得分:0)
来源-https://users.rust-lang.org/t/how-to-serialize-a-u32-into-byte-array/986/5
fn u32_to_u8_array(x: u32) -> [u8; 4] {
let b1: u8 = ((x >> 24) & 0xff) as u8;
let b2: u8 = ((x >> 16) & 0xff) as u8;
let b3: u8 = ((x >> 8) & 0xff) as u8;
let b4: u8 = (x & 0xff) as u8;
[b1, b2, b3, b4]
}