我曾经wasm-bindgen
编写过一个非常基本的 JS/Wasm webapp,其中将灰度转换(用 Rust 编写)应用于 webapp 用户通过 an 上传<input type="file">
并显示在<canvas>
.
这样做,我必须将图像加载到 WebAssembly 内存空间中,对每个像素应用转换,然后将结果返回到内存空间中,以便 JS 处理显示:
import { memory} from "img-grayscale-wasm/img_grayscale_wasm_bg";
import {MyImage} from "img-grayscale-wasm"
//...
async function processImg(file, width, height){
const canvas = document.getElementById("pixel-grayscale");
var resp = await fetch(file.name)
var bytes = await resp.arrayBuffer()
const myImage = MyImage.new();
const ptr = myImage.alloc(bytes.byteLength);
// Copy to memory space
const imgArray = new Uint8Array(memory.buffer, ptr, bytes.byteLength);
imgArray.set(new Uint8Array(bytes));
// transform img
myImage.read_img(ptr, bytes.byteLength)
const grayScalePtr = myImage.to_grayscale(width, height)
// read from memory space
const arr = new Uint8ClampedArray(memory.buffer, grayScalePtr, width * height * 4);
let imageData = new ImageData(arr, width);
getContextFromCanvas(canvas, width, height).putImageData(imageData, 0, 0);
}
web-sys
如果我使用crate 中定义的 web 的 API 绑定,我想我可以避免将东西来回复制到内存空间的整个过程,从fetch
文件到灰度图片的显示。
这就是我感到困惑的地方:在性能方面,使用web-sys
它的 web 的 API 绑定而不是全部用 JavaScript 进行是否有好处?好吧,我想有,但它在哪里?