当前位置: 首页 > 知识库问答 >
问题:

C dll发送图像到XUL app

周宏胜
2023-03-14

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

>

  • 我试图在我的dll中将图像编码为Base64,并通过js-Ctype将字符串发送到javascript,并将b64字符串设置为基本html图像对象的源。(
  • 我试图将jpg的图像写入硬盘,并在javascript中再次加载(〜3-4secs)
  • 我现在有了下面的函数,它调用我的C-DLL:(vars calFactor,pageNumber和pdfFilePath与我的问题无关)

       copyImageData : function(pdfFilePath, pageNumber, canvas, scaleFactor) { 
         var startLoad = new Date();
         var ctx = canvas.getContext('2d');
         var imageData = ctx.createImageData(canvas.width, canvas.height);
         var buffer    = new ArrayBuffer(imageData.data.length);
         var buffer8   = new Uint8ClampedArray(buffer);
         var bufferPtr = ctypes.uint32_t.ptr(buffer);
    
         copyImageData(pdfFilePath, pageNumber, bufferPtr, canvas.width, canvas.height, 0, 0, scaleFactor);
    
         imageData.data.set(buffer8);
    
         ctx.putImageData(imageData, 0, 0);
         consoleService.logStringMessage("Operation load image took: " + (new Date() - startLoad));
    
       }
    

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

    现在的问题是,标准的. set函数(imagedata.data.set(缓冲区8);)太慢了。". set"函数复制内部某处提供的数据。(在2.6GHz CPU上需要大约0.3秒,这还不够快)

    是不是可以直接设置数据,而不需要到处复制?是否可以直接填充画布的数组缓冲区?

    有没有人有别的办法让这个更快?

  • 共有1个答案

    尹庆
    2023-03-14

    好啊我已经解决了我的问题。最快的方法是不让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);
           }
    
     类似资料:
    • 你好,我想上传多张图片到firebase。目前我可以上传1张图片。尽管如此,我还是决定将所有内容作为HTML,比如标题、描述和图像,放在一个webview中,并从那里显示出来。目前,这项工作还不错,我在firebase中有一个字符串,包含所有这些内容: 不过,正如您所见,这只是本地存储的工作形式。如何下载这些图像并用正确的firebase图像URL替换图像src。

    • 问题内容: 我有一个生成图像的Java Applet。最终,我想将图像数据插入数据库中,因此我想将图像数据临时存储在包含小程序的页面上的表单字段中。我希望在不将图像文件存储在客户端计算机上的情况下执行此操作。 所有这些都来自签名板。这是一些应该从sigObj对象中存储的矢量数据生成位图图像的代码: image变量是BufferedImage对象。另外,如果我只是将图像变量发送回我的JavaScri

    • 我正在尝试使用JNI将一个图像从C++发送到java。该图像是一个用C++创建的位图,其中我使用将像素转换为一个。当使用C++将图像保存到文件中时,没有任何问题,但是当将像素发送到Java时,图像会变得模糊。JavaDocs说我必须使用来实现BufferedImage,但我觉得压缩中有问题 C++位图 这是图像的结果

    • 问题内容: 我想使用Http Post将图像从android客户端发送到Django服务器。该图像是从图库中选择的。目前,我正在使用列表值名称对来将必要的数据发送到服务器,并从JSON中接收来自Django的响应。是否可以对图像使用相同的方法(对于JSON响应中嵌入的图像使用URL)? 另外,哪种方法更好:远程访问图像而不从服务器下载图像或将其下载并存储在位图数组中并在本地使用?图像数量很少(<1

    • 为空。对如何发送图像有什么建议吗? 谢了。

    • 问题内容: 我正在制作一个应用程序,用于将图像从Android设备发送到在PC上运行的Java应用程序。客户端(android)上的图片是,我将其转换为,以便通过蓝牙发送到服务器。 请注意,位图来自已压缩的文件,因此我不需要再次对其进行压缩。 我在服务器(Java)上使用以下代码: 客户端没有错误。但是我在服务器端(Java应用程序)遇到此异常: java.lang.IllegalArgument