我在这里尝试了所有解决方案,但对我没有任何帮助。我的图片总是比我的d3.js画布小。
我必须设置画布width
,height
然后在clearRect
上进行画布context
以使其起作用。这是我的工作版本
导出功能:
var svgHtml = document.getElementById("d3-canvas"),
svgData = new XMLSerializer().serializeToString(svgHtml),
svgBlob = new Blob([svgData], {type:"image/svg+xml;charset=utf-8"}),
bounding = svgHtml.getBoundingClientRect(),
width = bounding.width * 2,
height = bounding.height * 2,
canvas = document.createElement("canvas"),
context = canvas.getContext("2d"),
exportFileName = 'd3-graph-image.png';
canvas.width = width;
canvas.height = height;
var image = new Image();
image.onload = function() {
context.clearRect(0, 0, width, height);
context.drawImage(image, 0, 0, width, height);
canvas.toBlob(function(blob) {
saveAs(blob, exportFileName);
});
};
var svgUrl = URL.createObjectURL(svgBlob);
image.src = svgUrl;
它使用FileSaver.js保存文件。
这是我的画布创建,请注意我在这里解决了名称空间问题
d3.js画布创建:
var canvas = d3.select("body")
.insert("svg")
.attr('id', 'd3-canvas')
.attr("xmlns", "http://www.w3.org/2000/svg")
.attr("xmlns:xlink", "http://www.w3.org/1999/xlink")
.attr("width", width)
.attr("height", height);