使用 d3.js 将 SVG 转换为 Canvas [英] SVG to Canvas with d3.js
问题描述
有没有人在创建 d3.js 可视化时尝试使用 svg to canvas 库?我尝试使用 canvg.js 和 d3.js 从 android 2.3 应用程序 webview 中将 svg 转换为画布,但是当我调用时:
Has anyone tried using a svg to canvas library when creating d3.js visualizations? I've tried to use canvg.js and d3.js to convert svg to canvas from within an android 2.3 application webview, but when I call:
svg.selectAll(".axis")
.data(d3.range(angle.domain()[1]))
.enter().append("g")
.attr("class", "axis")
.attr("transform", function(d) { return "rotate(" + angle(d) * 180 / Math.PI + ")"; })
.call(d3.svg.axis()
.scale(radius.copy().range([-5, -outerRadius]))
.ticks(5)
.orient("left"))
.append("text")
.attr("y",
function (d) {
if (window.innerWidth < 455){
console.log("innerWidth less than 455: ",window.innerWidth);
return -(window.innerHeight * .33);
}
else {
console.log("innerWidth greater than 455: ",window.innerWidth);
return -(window.innerHeight * .33);
}
})
.attr("dy", ".71em")
.attr("text-anchor", "middle")
.text(function(d, i) { return capitalMeta[i]; })
.attr("style","font-size:12px;");
我收到错误消息:Uncaught TypeError: Cannot call method setProperty
of null http://mbostock.github.com/d3/d3.js?2.5.0:1707
I get the error: Uncaught TypeError: Cannot call method setProperty
of null http://mbostock.github.com/d3/d3.js?2.5.0:1707
某种无头浏览器应用程序或服务器端 js 解析器可以工作吗?有没有人遇到过这种情况?
Would some sort of headless browser application, or a server side js parser work? Has anyone encountered this before?
推荐答案
这里有一种方法可以将 svg 写入画布(然后将结果保存为 png 或其他格式):
Here's one way you could write your svg to canvas (and then save the result as a png or whatever):
// Create an export button
d3.select("body")
.append("button")
.html("Export")
.on("click",svgToCanvas);
var w = 100, // or whatever your svg width is
h = 100;
// Create the export function - this will just export
// the first svg element it finds
function svgToCanvas(){
// Select the first svg element
var svg = d3.select("svg")[0][0],
img = new Image(),
serializer = new XMLSerializer(),
svgStr = serializer.serializeToString(svg);
img.src = 'data:image/svg+xml;base64,'+window.btoa(svgStr);
// You could also use the actual string without base64 encoding it:
//img.src = "data:image/svg+xml;utf8," + svgStr;
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
canvas.width = w;
canvas.height = h;
canvas.getContext("2d").drawImage(img,0,0,w,h);
// Now save as png or whatever
};
这篇关于使用 d3.js 将 SVG 转换为 Canvas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!