Emscripten 将 uint8_t 数组传递给 javascript?
Emscripten pass uint8_t array to javascript?
正在尝试将 uint8_t* rgb 图像数据缓冲区显示到 HTML canvas,这是通过 WASM 在 C 中处理的。
在 C 中,我有以下外部方法:
extern void JS_DisplayRenderData(uint8_t* data, int dataLength);
然后我像这样调用外部方法:
int size = 1280 * 720 * 3;
uint8_t data[size];
memset(data, 255, size);
JS_DisplayRenderData(data, size);
在 javaScript 然后我尝试像这样显示缓冲区:
if (typeof mergeInto !== 'undefined') mergeInto(LibraryManager.library,
{
JS_DisplayRenderData: function(data, dataLength)
{
alert("Data Length: " + dataLength);
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
var imgdata = ctx.getImageData(0, 0, c.width, c.height);
var imgdatalen = imgdata.data.length;
var i2 = 0;
for (var i = 0; i < (imgdatalen / 4); i++)
{
imgdata.data[4*i] = data[i2]; // RED (0-255)
imgdata.data[4*i+1] = data[i2+1]; // GREEN (0-255)
imgdata.data[4*i+2] = data[i2+2]; // BLUE (0-255)
imgdata.data[4*i+3] = 255; // APLHA (0-255)
i2 += 3;
}
ctx.putImageData(imgdata, 0, 0);
}
});
然而我得到的只是黑色像素,即使它应该都是白色的。
找到了 tnx 的答案:
只需通过以下方式说明缓冲区类型:"var a = HEAPU8.subarray(data);"
我用C调用JS的方法可以找到:Webassembly calling JavaScript methods from wasm i.e. whithin c++ code
正在尝试将 uint8_t* rgb 图像数据缓冲区显示到 HTML canvas,这是通过 WASM 在 C 中处理的。
在 C 中,我有以下外部方法:
extern void JS_DisplayRenderData(uint8_t* data, int dataLength);
然后我像这样调用外部方法:
int size = 1280 * 720 * 3;
uint8_t data[size];
memset(data, 255, size);
JS_DisplayRenderData(data, size);
在 javaScript 然后我尝试像这样显示缓冲区:
if (typeof mergeInto !== 'undefined') mergeInto(LibraryManager.library,
{
JS_DisplayRenderData: function(data, dataLength)
{
alert("Data Length: " + dataLength);
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
var imgdata = ctx.getImageData(0, 0, c.width, c.height);
var imgdatalen = imgdata.data.length;
var i2 = 0;
for (var i = 0; i < (imgdatalen / 4); i++)
{
imgdata.data[4*i] = data[i2]; // RED (0-255)
imgdata.data[4*i+1] = data[i2+1]; // GREEN (0-255)
imgdata.data[4*i+2] = data[i2+2]; // BLUE (0-255)
imgdata.data[4*i+3] = 255; // APLHA (0-255)
i2 += 3;
}
ctx.putImageData(imgdata, 0, 0);
}
});
然而我得到的只是黑色像素,即使它应该都是白色的。
找到了 tnx 的答案:
只需通过以下方式说明缓冲区类型:"var a = HEAPU8.subarray(data);"
我用C调用JS的方法可以找到:Webassembly calling JavaScript methods from wasm i.e. whithin c++ code