Javascript C dll将图像数据发送到XUL应用程序。帆布

Javascript C dll将图像数据发送到XUL应用程序。帆布,javascript,c,dll,jsctypes,Javascript,C,Dll,Jsctypes,我需要在XUL桌面应用程序的画布上显示一个图像(~5000*~7000像素)。 图像数据来自C-DLL,它执行基本的图像处理操作。 到目前为止,我尝试的方法存在性能问题: 我尝试在dll中将图像编码为Base64,并通过js Ctypes将字符串发送到javascript,并将b64字符串设置为基本html图像对象的源代码。(~13-18秒将图像放到画布上) 我尝试将图像以jpg的形式写入硬盘,并用javascript再次加载它(~3-4秒) 我现在有以下调用我的C-DLL的函数: (vars比

我需要在XUL桌面应用程序的画布上显示一个图像(~5000*~7000像素)。 图像数据来自C-DLL,它执行基本的图像处理操作。 到目前为止,我尝试的方法存在性能问题:

  • 我尝试在dll中将图像编码为Base64,并通过js Ctypes将字符串发送到javascript,并将b64字符串设置为基本html图像对象的源代码。(~13-18秒将图像放到画布上)
  • 我尝试将图像以jpg的形式写入硬盘,并用javascript再次加载它(~3-4秒)
  • 我现在有以下调用我的C-DLL的函数: (vars比例因子、页码和PdfilePath与我的问题无关)

  • copyImageData将信息发送到my DLL,然后直接在C中用imagedata填充Arraybuffer。这是可能的,因为指针:ctypes.uint32\u t.ptr(缓冲区)

    现在的问题是,standart“.set”函数(imagedata.data.set(buffer8);)太慢。 “.set”函数将提供的数据复制到内存中的某个位置。(在2.6GHz CPU上大约需要0.3sec,这还不够快)

    是否可以直接设置数据而不复制数据? 可以直接填充画布的阵列缓冲区吗


    有没有人知道我该如何加快速度?

    好的。我已经解决了我的问题。最快的方法是不让Javascript做任何事情:D 诀窍是获取图像对象的底层缓冲区(Imagedata.data.buffer)并在其周围放置Uint8ClampedArray。 图像对象的缓冲区将直接填充在C-dll中,并且不会被图像对象的“set”函数复制

    这段代码需要42毫秒才能将所需的数据放到画布上。 代码如下:

            copyImageData : function(pdfFilePath, pageNumber, canvas, offsetX, offsetY, scaleFactor) { 
                var startLoad = new Date();
    
                var ctx = canvas.getContext('2d');
                var imageData = ctx.createImageData(canvas.width, canvas.height);
                var buffer    = imageData.data.buffer;
                var buffer8   = new Uint8ClampedArray(buffer);
                var bufferPtr = ctypes.uint32_t.ptr(buffer);
    
                copyImageData(pdfFilePath, pageNumber, bufferPtr, canvas.width, canvas.height, offsetX, offsetY, scaleFactor);
                ctx.putImageData(imageData, 0, 0);
           }
    

    非常感谢分享这个!!我使用了
    memset
    作为本机屏幕截图插件。你的全部作品是开源的吗?你能分享一下吗?很抱歉这个项目是有偿工作的一部分,而且源代码不是开源的。如果你对某些特定的事情有疑问,请给我发个短信:-)好的,谢谢弗洛克!顺便说一句,那个项目有空缺吗?我在找;)
            copyImageData : function(pdfFilePath, pageNumber, canvas, offsetX, offsetY, scaleFactor) { 
                var startLoad = new Date();
    
                var ctx = canvas.getContext('2d');
                var imageData = ctx.createImageData(canvas.width, canvas.height);
                var buffer    = imageData.data.buffer;
                var buffer8   = new Uint8ClampedArray(buffer);
                var bufferPtr = ctypes.uint32_t.ptr(buffer);
    
                copyImageData(pdfFilePath, pageNumber, bufferPtr, canvas.width, canvas.height, offsetX, offsetY, scaleFactor);
                ctx.putImageData(imageData, 0, 0);
           }