В принципе невозможно отлаживать вещи без доступа к отладчику или возможности распечатывать сообщения.Из-за этого я перенес ваш код для использования wasm-bindgen , исключительно для возможности доступа к консоли изнутри кода Rust:
#![feature(proc_macro, wasm_custom_section, wasm_import_module)]
extern crate wasm_bindgen;
extern crate image;
use wasm_bindgen::prelude::*;
use std::mem;
pub mod console {
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern {
#[wasm_bindgen(js_namespace = console)]
pub fn log(s: &str);
}
}
#[wasm_bindgen]
pub fn alloc(len: usize) -> *mut u8 {
let mut buf = Vec::with_capacity(len);
let ptr = buf.as_mut_ptr();
mem::forget(buf);
ptr
}
#[wasm_bindgen]
pub fn read_img(ptr: *mut u8, len: usize) {
let img = unsafe { Vec::from_raw_parts(ptr, len, len) };
if let Err(e) = image::load_from_memory(&img) {
console::log(&e.to_string());
}
}
Обновленный JavaScript:
const js = import("./imaj_bg");
async function loadImgIntoMem(img, { alloc, memory }) {
const resp = await fetch(img);
const buf = await resp.arrayBuffer();
const len = buf.byteLength;
const ptr = alloc(len);
const imgArray = new Uint8Array(memory.buffer, ptr, len);
imgArray.set(new Uint8Array(buf));
return { ptr, len };
}
async function go(js) {
const { ptr, len } = await loadImgIntoMem('cat.jpg', js);
js.read_img(ptr, len);
};
js.then(go);
Создание и обслуживание кода:
$ cargo build --target wasm32-unknown-unknown --release
$ wasm-bindgen target/wasm32-unknown-unknown/release/imaj.wasm --out-dir=.
$ yarn serve
Доступ к странице и просмотр журнала консоли показывает это антиклиматическое сообщение:
operation not supported on wasm yet
Правда в том, что есть большие частистандартная библиотека Rust, которой еще нет в WebAssemblyМногие из них заглушены, чтобы вернуть эту ошибку.
Я не знаю точно, какая поддержка платформы отсутствует в вашем коде.Наиболее очевидным является многопоточность, которая требуется для функций jpeg_rayon
и hdr
, но при отключении всех функций изображения, кроме jpeg
, по-прежнему выдается та же ошибка.Вероятно, что-то еще нужно.
Однако, похоже, что оно специфично для данного кодека изображения.Если вы попробуете тот же код, но загрузите изображение в формате PNG, оно будет успешным:
pub fn read_img(ptr: *mut u8, len: usize) {
let img = unsafe { Vec::from_raw_parts(ptr, len, len) };
let img = match image::load_from_memory(&img) {
Ok(i) => i,
Err(e) => {
console::log(&e.to_string());
return;
}
};
console::log(&format!("{:?}", img.to_rgba()));
}
ImageBuffer { width: 305, height: 314, _phantom: PhantomData, data: [255, 255, 255, 0 /* remaining pixels skipped */
Это означает, что код JPEG еще не работает с WASM.Данный кодек может или не может работать еще;Вероятно, лучше всего подавать проблемы с сопровождающими из основной ветки разработки.