gpt4 book ai didi

rust - 如何使用 Rust 和 web-sys 将 Clamped> 转换为 Clamped<&mut [u8]> ?

转载 作者:行者123 更新时间:2023-12-03 11:29:36 25 4
gpt4 key购买 nike

我正在使用 Rust 和 WebAssembly 操作像素数据,并且正在努力使用操作的像素创建新的 ImageData。

当我得到我的 ImageData 时的数据,它返回 Clamped<Vec<u8>>

   fn get_buffer_image_data(&self) -> Clamped<Vec<u8>> {
let image_data = match self.buffer_ctx.get_image_data(0.0, 0.0, 640.0, 480.0) {
Ok(d) => d,
Err(_err) => panic!("failed to fetch buffer image data")
};

image_data.data()
}

我在另一个函数中操作像素数据,然后尝试使用这些操作的像素创建新的 ImageData。问题是我只能用 Clamped<&mut [u8]> 创建新的 ImageData

    fn create_image_data(&self, data: Clamped<Vec<u8>>) {
let imageData = ImageData::new_with_u8_clamped_array_and_sh(data, 640, 480);
}

但是,我收到的错误是:

mismatched types

expected `&mut [u8]`, found struct `std::vec::Vec`

note: expected struct `wasm_bindgen::Clamped<&mut [u8]>`
found struct `wasm_bindgen::Clamped<std::vec::Vec<u8>>`

我想我需要将一种类型转换为另一种类型。如何高效转换?我已经尝试这个有一段时间了,但我被困住了。我唯一的解决方案是将整个 Uint8ClampedArray 从我的 JS 发送到 wasm 。这是您可以使用的代码示例。请注意,如果您克隆此存储库,请 checkout 分支 problem https://github.com/Fallenstedt/rotated-pixels/blob/problem/src/pixel_rotator.rs#L42-L44

最佳答案

如果你查看 Clamped 的源代码,您会发现它只是 T 的包装。

pub struct Clamped<T>(pub T);

由于内部 T 是公共(public)的,因此您可以对其执行任何操作,例如将 Vec 转换为切片:

let slice_data: &mut [u8] = &mut data.0[..];

然后,您可以将 slice_data 包装在 Clamped 的新实例中,并将其传递给 ImageData:

fn create_image_data(&self, data: Clamped<Vec<u8>>) {
let slice_data = Clamped(&mut data.0[..]);
let imageData = ImageData::new_with_u8_clamped_array_and_sh(slice_data, 640, 480);
}

关于rust - 如何使用 Rust 和 web-sys 将 Clamped<Vec<u8>> 转换为 Clamped<&mut [u8]> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65173375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com