Emscripten将uint8_t数组传递给javascript?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Emscripten将uint8_t数组传递给javascript?相关的知识,希望对你有一定的参考价值。

尝试将uint8_t * rgb图像数据缓冲区显示到通过WASM在C中处理的html画布。

在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:Struct operations in Javascript through Emscripten

只需要说明缓冲区类型是什么:“var a = HEAPU8.subarray(data);”

我可以找到我用来通过C调用JS的方法:Webassembly calling JavaScript methods from wasm i.e. whithin c++ code

以上是关于Emscripten将uint8_t数组传递给javascript?的主要内容,如果未能解决你的问题,请参考以下文章

使用 emscripten 将数组传递给 C 函数

将 uint8_t 数组传递给方法

将 JS 数字数组传递给 emscripten C++ 而无需 reinterpret_cast

将指向 uint16_t 的指针传递给需要 C 中 uint8_t[] 数组的子例程 - 如何?

使用 emscripten 将字符串从 C++ 传递给 JS

将文件名传递给 Emscripten 生成的 js 作为参数