簡體   English   中英

如何轉換 Clamped <vec<u8> &gt; 用 Rust 和 web-sys 夾緊&lt;&amp;mut [u8]&gt;? </vec<u8>

[英]How do I convert Clamped<Vec<u8>> to Clamped<&mut [u8]> with Rust and web-sys?

我正在使用 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()
}

我在另一個 function 中操作像素數據,然后嘗試使用這些操作像素創建新的 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是公共的,所以可以對其執行任何操作,例如將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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM