如果无法访问调试器或无法打印消息,则基本上不可能进行调试。因此,我将您的代码移植到使用wasm-bindgen https://github.com/rustwasm/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
and 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 配合使用。给定的编解码器可能工作也可能不工作;最好向上游维护者提出问题。