Goal - using the client-side:
将动态SVG绘图(使用d3js创建)转换为可下载的PNG图像,并使用Internet Explorer工作 .
Accomplished:
在Chrome中实现,没问题 . 一旦我有PNG DataURI,它就很容易转换为可下载的PNG blob .
不幸的是,在IE中运行相同的代码会产生SecurityException,当我尝试将画布转换为PNG DataURI(canvas.toDataURL)时,它会失败 .
显然这是一个活跃的IE BUG,我在StackExchange上找到了同样问题的其他人 . 我相信它与应用于源自其他域的图像的CORS限制有关(并且在画布中绘制),但我的SVG源自本地页面 .
Thoughts
想知道原因是否与我为IMG元素呈现的SVG图形生成初始DataURI(data:image / svg xml)的方式有关 .
我已经尝试了两种替代方法来生成image / svg xml,base64和charset = utf8,但它们还没有克服遇到的问题 . 所以想知道它是否是SVG的内容,目前SVG绘图中没有图像 .
Code for reference:
var rawSvg = new XMLSerializer().serializeToString(svgElement);
var img3 = new Image();
document.body.appendChild(img3);
var canv = document.createElement("canvas");
var canv_ctx = canv.getContext("2d");
img3.onload = function () {
//-- Image has loaded using the native data:image/svg+xml
canv_ctx.drawImage(this, 0, 0);
//-- IE Will throw a Security Exception here...
console.log(canv.toDataURL("image/png"));
};
img3.src = "data:image/svg+xml;base64," + btoa(rawSvg);
//-- Or utf8
//img3.src = "data:image/svg+xml;charset=utf8," + encodeURIComponent(rawSvg);
UPDATE:
测试了Canvg对2d上下文“drawSvg(...)”的扩展,它绘制在画布上 . 这在canvas元素上调用toDataURL时克服了SecurityException,但是draw函数对于文本呈现和放置来说不够准确 . 所以我仍然需要一个解决方案 .
参见示例屏幕截图,left correct rending using native drawImage and right the incorrect rendering using Canvg's drawSvg
Code using Canvg - NB: You'll need to reference the JS
var canvas = document.createElement("canvas"),
cctx = canvas.getContext("2d");
var rawSvg = new XMLSerializer().serializeToString(svgClone.node());
canvas.width = svgWidth;
canvas.height = svgHeight;
//cctx.drawImage(this, 0, 0);
//-- Use Canvg's extension to canvasContext
cctx.drawSvg(rawSvg);
//-- This Works on IE - not accurate though
var dataURL = canvas.toDataURL();