如何使用 Rust 和 web-sys 将 Clamped<Vec<u8>> 转换为 Clamped<&mut [u8]>?
How do I convert Clamped<Vec<u8>> to Clamped<&mut [u8]> with Rust and web-sys?
我正在使用 Rust 和 WebAssembly 操纵像素数据,并且正在努力用操纵的像素创建新的 ImageData。
当我得到我的 ImageData
's data, it returns a 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。这是您可以使用的代码示例。注意,如果你克隆这个 repo,请检查分支 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 和 WebAssembly 操纵像素数据,并且正在努力用操纵的像素创建新的 ImageData。
当我得到我的 ImageData
's data, it returns a 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。这是您可以使用的代码示例。注意,如果你克隆这个 repo,请检查分支 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);
}