【发布时间】:2016-07-06 17:40:46
【问题描述】:
我正在尝试将 svg 转换为 png,我发现转换后的图像与 svg 不同。如何保证 svg 和 png 之间的一致性?
将 svg 转换为 png 的代码
jQuery('#imgDiv').css({display: 'block', 'padding-left': '25px', overflow: 'scroll'});
jQuery('#resImg').css({display: 'block', 'padding-left': '25px'});
var svg = jQuery('#map').html().replace(/>\s+/g, ">").replace(/\s+</g, "<");
// strips off all spaces between tags
canvg('cvs', svg, {
ignoreMouse: true,
ignoreAnimation: true
});
var canvas = document.getElementById('cvs');
img = canvas.toDataURL("image/png", 1);
var a = document.createElement('a');
a.href = img;
a.download = "image.png";
var clickEvent = new MouseEvent("click", {
"view": window,
"bubbles": true,
"cancelable": false
});
a.dispatchEvent(clickEvent)
一切都是文件,但是当我看到下载的图像时,高度、宽度不同,标签和字体不可见。
生成 svg 的代码:
var width = 1260,
height = 910;
var svg = d3.select("#map")
.append("svg")
.attr("width", width)
.attr("height", height)
.on("contextmenu", function (d, i) {
d3.event.preventDefault();
printMap();
});
svg.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", width)
.attr("height", height)
.style("stroke", '#000000')
.style("stroke-opacity", 1)
.style("fill", "#FFF")
.style("fill-opacity", 0)
.style("stroke-width", 2);
var cluster = topojson.feature(data, data.objects.clustergeojson).features;
var projection = d3.geo.mercator();
s = 250;
projection.scale(8500)
.center([83, 29.5]);
var path = d3.geo.path().projection(projection);
var b = path.bounds(cluster),
s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];
实际 SVG:
转换后的 PNG:
这里是示例jsFiddle。
var projection = d3.geo.mercator()
.scale(5000)
.center([83.96, 28.27]);
如果我将比例从 5000 更改为 6000,则 svg 会更大,但 png 不会。小提琴输出的svg可以右键导出为png。
【问题讨论】:
-
我自己没用多久。不确定您的问题是什么,但不确定您是否知道,CSS 样式只有在它是内联时才有效。如果你给某个东西一个类并在 CSS 中设置该类的样式,它将不起作用,例如,宽度高度字体大小等。话虽如此,我知道这条线会出现在生成的画布中:''.style ("fill", "#FFF")'' 在 D3 中,但我不确定这一行:''jQuery('#imgDiv').css({display: 'block', 'padding-left': '25px ', overflow: 'scroll'});@@ 因为我没有使用 JQuery,我可能错了。如果可以的话,把你的问题简单地摆弄一下,我会看看
-
@thisOneGuy 我发现问题在于 d3 比例,这使得 svg 更大,但 png 导出的尺寸很小。这是小提琴jsfiddle.net/bnLoq1Lw/6。您可以尝试使用 var projection = d3.geo.mercator() .scale(5000) .center([83.96, 28.27]);从 5000->6000 并右键单击 svg。
标签: canvas d3.js svg png canvg