我在svg2png的速度上遇到困难,想知道是否有任何方法可以改善它。我正在使用D3创建雷达图。所有这些都由Node.js在jsdom中呈现。使用svg2png将所得的SVG转换为PNG。这样做的目的是将图像插入到提供给最终用户的报告中。应用程序中使用了呈现雷达图的相同JavaScript(无需node.js),并且运行非常迅速。

使用.NET Core 2.1和Node.js v8.11.2

将svg转换为png所需的时间约为2-3秒。

调用节点服务;

public async Task<string> GetRadarChartAsync(dynamic options)
{
  return await _nodeServices.InvokeAsync<string>("./wwwroot/js/node-radar-chart.js", options);
}


这样调用,并提取了base64图像。

Task<string> result = (Task<string>)mapped_function.DynamicInvoke(objects.ToArray<object>());
string img_base64 = result.Result;


javascript包装器如下所示;

module.exports = function(callback, options, data) {

   const dom = new JSDOM(`<!DOCTYPE html><div id="body" class="radar-chart"></div>`);

   var options1 = {
       window: dom.window,
       selector: '.radar-chart',
       data: JSON.parse(data.radar)
   }

   var options_combined = Object.assign(options1, options);

   var chart1 = new RadarChart(options_combined);

   // Convert SVG to PNG and return it to controller
   var svgText = chart1.html();

   svg2png(Buffer.from(svgText))
      .then(buffer => buffer.toString('base64'))
      .then(buffer => callback(null, buffer));

}


更新14/8/18

以前错误地将此问题标记为节点和.NET Core 2.1之间的调用问题。进一步调查显示svg2png引起了问题。

进一步更新

问题可能是由于使用PhantomJS的svg2png引起的。提议的想法是允许svg2png在多个调用中使用相同的PhantomJS实例,但是在此问题上尚未开发。请参见svg2png github

在提出更好的解决方案之前,我将不得不处理速度问题。

最佳答案

当我尝试NodeServices samples on GitHub(尤其是服务器端渲染一个)时,使用.NET 2.0时,调用时间最少为1秒。当我使用.NET 2.1进行尝试时,如果我没记错的话,它会减少到100ms或更短。因此,NodeServices的调用时间有可能从2.0缩短到2.1。

如果无法升级,那么也许可以重构,以便只需要调用一次NodeServices。

关于c# - svg2png性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51814060/

10-11 05:53