【问题标题】:How do I convert Clamped<Vec<u8>> to Clamped<&mut [u8]> with Rust and web-sys?如何使用 Rust 和 web-sys 将 Clamped<Vec<u8>> 转换为 Clamped<&mut [u8]>?
【发布时间】:2021-03-18 06:23:40
【问题描述】:

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

当我得到ImageData 的数据时,它返回一个Clamped&lt;Vec&lt;u8&gt;&gt;

   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

【问题讨论】:

标签: rust webassembly wasm-bindgen


【解决方案1】:

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

pub struct Clamped<T>(pub T);

因为内部的T是公开的,你可以对其进行任何操作,比如将Vec转换为切片:

let slice_data: &mut [u8] = &mut t[..];

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多