javascript - svg 导出到 png 仅使用 Angular 导出 JavaScript 中渲染的 svg 的一小部分/一小部分

标签 javascript angularjs svg

我需要一些关于将渲染的 svg 词云导出为 png 的建议。

我的设置可以正常工作,但它只导出渲染词云的一小部分。

我认为这可能与我需要设置的尺寸有关。我不知道。

这是我的 Angular/JavaScript 导出函数:

scope.exportToPNG2 = function () {

  var svg = document.querySelector('#wordCloudSVG');

  var canvas = document.getElementById('WordCloudCanvas');

  var ctx = canvas.getContext('2d');
  var data = (new XMLSerializer()).serializeToString(svg);
  var DOMURL = window.URL || window.webkitURL || window;

  var img = new Image();
  var svgBlob = new Blob([data], { type: 'image/svg+xml;charset=utf-8' });
  var url = DOMURL.createObjectURL(svgBlob);

  img.onload = function () {
      ctx.drawImage(img, 0, 0);
      DOMURL.revokeObjectURL(url);

      var imgURI = canvas
          .toDataURL('image/png')
          .replace('image/png', 'image/octet-stream');

      triggerDownload(imgURI);
  };

  img.src = url;
}


function triggerDownload(imgURI) {
  var evt = new MouseEvent('click', {
      view: window,
      bubbles: false,
      cancelable: true
  });

  var a = document.createElement('a');
  a.setAttribute('download', 'MY_COOL_IMAGE.png');
  a.setAttribute('href', imgURI);
  a.setAttribute('target', '_blank');

  a.dispatchEvent(evt);
}

这是渲染我的词云的模板:

<div id="wordCloud">
    <button class="basicButton" ng-click="exportToPNG2()">Export to .PNG</button>
    <div id="wordCloudVisualisation"></div>
    <canvas id="WordCloudCanvas"></canvas>
</div>

这张图片显示了我的<div>我的词云被渲染到的地方。黄色突出显示的 block 是词云的一部分,被重新绘制为 png 并导出:

enter image description here

var svg = document.querySelector('#wordCloudSVG'); 中的元素 ID我在 Chrome 开发工具中得到了这样的结果:

enter image description here

我必须更改什么才能导出整个词云?

最佳答案

由于这篇文章,我对导出功能做了一些细微的更改:https://gist.github.com/gustavohenke/9073132

我根据svg.getBoundingClientRect()设置 Canvas 大小

这是我的工作解决方案(请参阅代码中的注释):

scope.exportToPNG2 = function () {

  var svg = document.querySelector('#wordCloudSVG');

  //create a canvas
  var canvas = document.createElement("canvas");

  //set size for the canvas
  var svgSize = svg.getBoundingClientRect();
  canvas.width = svgSize.width;
  canvas.height = svgSize.height;

  var ctx = canvas.getContext('2d');

  var data = new XMLSerializer().serializeToString(svg);

  var DOMURL = window.URL || window.webkitURL || window;

  var img = new Image();
  var svgBlob = new Blob([data], { type: 'image/svg+xml;charset=utf-8' });
  var url = DOMURL.createObjectURL(svgBlob);

  img.onload = function () {
      ctx.drawImage(img, 0, 0);
      DOMURL.revokeObjectURL(url);

      var imgURI = canvas
          .toDataURL('image/png')
          .replace('image/png', 'image/octet-stream');

      triggerDownload(imgURI);
  };

  img.src = url;
}

关于javascript - svg 导出到 png 仅使用 Angular 导出 JavaScript 中渲染的 svg 的一小部分/一小部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42152748/

相关文章:

Javascript正则表达式来匹配货币

javascript - 为什么这个函数不停止它的父函数?

javascript - 期望数组中的项目

javascript - Controller 不应在 $location.path() 上重新加载

javascript - D3 - 根据数据键更新图表

javascript - 需要在操作系统中更改暗/亮模式以强制刷新外部 SVG 文件

javascript - 使用 D3.js 分组条形图 "in one line"

java - 如何使用angular js spring mvc上传多部分文件

angularjs - ng-if 隐藏安全信息有多安全

javascript - 在 javascript 中设置时,svg 文本实体会被转义