Я использовал wasm-bindgen
для написания очень простого веб-приложения JS / Wasm, в котором преобразование в градациях серого (написанное на Rust) применяется к изображению, загруженному пользователем веб-приложения через <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);
}
Я думаю, что смогу избежать всего процесса копирования материала назад и вперед в пространство памяти, если я использую привязку веб-API, определенную в ящике web-sys
, от fetch
отображения файла до отображениякартинка в градациях серого.
Вот где я запутался: с точки зрения производительности, есть ли выигрыш в использовании web-sys
и привязок его веб-API вместо того, чтобы делать все это в JavaScript?Ну, я полагаю, что есть, но где это?