[英]Large svg to png in fixed resolution
我正在使用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代碼可創建圖表。 並帶有一個保存和下載按鈕,保存將獲取數據URL到png,並將其保存在服務器上,而下載將立即下載圖像。
問題伴隨着“ renderCallback”出現,而svg很大,數據URL為空,我也嘗試了超時,但是沒有得到結果並且計時器繼續運行
最后,我進行了測試,實際上,在Firefox中大約23500 x 23500 px
的大小之前,它似乎運行良好。
但只有當您更改
d3.select("svg")
.attr(foo:bar)
.node().parentNode.innerHTML
與
d3.select("svg")
.attr(foo:bar)
.node().outerHTML();
另外,canvg似乎可以自行設置渲染畫布的大小,因此您的
d3.select('#hiddenCanvas').attr('width',_canvasWidth).attr('height',(parseFloat(_canvasHeight) + 300) );
是沒有用的,可能與設置_canvasWidth
和_canvasHeight
的部分_canvasHeight
。
__請謹慎處理此代碼段,否則會出現滯后現象__
function getDiagramImage(isTrue,_callback){ var html = d3.select("svg") .attr({ 'xmlns': 'http://www.w3.org/2000/svg', 'xmlns:xmlns:xlink': 'http://www.w3.org/1999/xlink', version: '1.1' }) .node().outerHTML; var canvas = document.getElementById('hiddenCanvas'); var context = canvas.getContext("2d"); canvg(canvas, 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); } }}); } getDiagramImage();
svg{border:3px solid green;} canvas{border:3px solid blue;} img{border:3px solid red;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/amcharts/3.13.0/exporting/canvg.js"></script> <svg id="svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="15000" height="15000" viewBox="-0.5,0,500.5,500.5"> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,118 382,500.5 441,500.5 -0.5,59 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,295 205,500.5 264,500.5 -0.5,236 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,59 441,500.5 500,500.5 499.8,500.2 -0.5,0 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,354 146,500.5 205,500.5 -0.5,295 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,500.5 28,500.5 -0.5,472 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,472 28,500.5 87,500.5 -0.5,413 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,413 87,500.5 146,500.5 -0.5,354 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="-0.5,236 264,500.5 323,500.5 -0.5,177 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="499.5,0.5 448,0.5 499.5,52 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="499.5,52 448,0.5 392,0.5 499.5,108 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="0,0.5 499.5,500 499.5,444 56,0.5 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="392,0.5 336,0.5 499.5,164 499.5,108 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="280,0.5 499.5,220 499.5,164 336,0.5 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="56,0.5 499.5,444 499.5,388 112,0.5 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="112,0.5 499.5,388 499.5,332 168,0.5 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="168,0.5 499.5,332 499.5,276 224,0.5 "/> <polygon fill="none" stroke="#000000" stroke-miterlimit="10" points="224,0.5 499.5,276 499.5,220 280,0.5 "/> </svg> <canvas id="hiddenCanvas"></canvas> <div id="pngdataurl"></div> <!--**__Be carefull with this snippet, there will be lags__**-->
這是我嘗試修復此問題的方法
function getDiagramImage(isTrue,_callback){
var html = d3.select("#nodePane svg#nodeEditor")
.attr({
'xmlns': 'http://www.w3.org/2000/svg',
'xmlns:xmlns:xlink': 'http://www.w3.org/1999/xlink',
version: '1.1'
})
.node().parentNode.innerHTML;
var _imageHeight = parseFloat(_canvasHeight);
var _imageWidth = parseFloat(_canvasWidth);
if(_imageHeight > 10000){
_imageHeight = 9700;
}
if(_imageWidth > 7000){
_imageWidth = 7000;
}
d3.select('#hiddenCanvas').attr('width',_imageWidth+"px").attr('height',( _imageHeight + 300+"px" ) );
var canvas = document.getElementById('hiddenCanvas');
var context = canvas.getContext("2d");
canvg('hiddenCanvas', html, {
ignoreMouse:true,
ignoreAnimation:true,
ignoreDimensions:true,
scaleWidth:_imageWidth,
scaleHeight:_imageHeight,
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);
}
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.