【发布时间】:2015-05-18 19:56:06
【问题描述】:
我正在使用 canvg lib 将 svg 转换为 png,但是当我的 svg 大小超过 10000 时,它无法在画布上绘制它并且 data-URL 仅获取“data:;”空的
这是我正在使用的代码
function getDiagramImage(isTrue,_callback){
var html = d3.select("svg")
//.attr("version", 1.1)
//.attr("xmlns", "http://www.w3.org/2000/svg")
.attr({
'xmlns': 'http://www.w3.org/2000/svg',
'xmlns:xmlns:xlink': 'http://www.w3.org/1999/xlink',
version: '1.1'
})
.node().parentNode.innerHTML;
d3.select('#hiddenCanvas').attr('width',_canvasWidth).attr('height',(parseFloat(_canvasHeight) + 300) );
var canvas = document.getElementById('hiddenCanvas');
var context = canvas.getContext("2d");
canvg(document.getElementById('hiddenCanvas'), html, {
renderCallback: function() {
var dataURL = canvas.toDataURL();
if(!isTrue){
var pngimg = '<img src="'+dataURL+'">';
d3.select("#pngdataurl").html(pngimg);
var a = document.createElement("a");
a.download = "export_"+Date.now()+".png";
a.href = dataURL;
document.body.appendChild(a);
a.click();
}
if(_callback){
_callback(dataURL);
}
}
});
}
关于此功能.. 有创建图表的 d3.js 代码。并且有一个保存和下载按钮,保存将获取 png 的数据 URL 并将其保存在服务器上,同时下载将立即下载图像。相同的功能适用于两个参数。
问题来自“renderCallback”,而 svg 很大,数据 URL 为空我也尝试超时,但它没有得到结果,计时器继续运行
【问题讨论】:
-
好的,它描述了问题,但有解决方案吗?
-
好吧,如果这是问题所在,解决方案是将您的 svg 解析为多个堆叠的画布,如接受答案的 cmets 中所建议的那样。不知道canvg有没有支持这个
-
我检查了高度是否超过 10000 我将其设置为 scaleHeight 10000 但 canvg 设置画布高度 34000 而不是 10000
标签: javascript canvas svg d3.js html5-canvas