我想要创建一个PNG格式的图片,原材料是SVG。我按照以下链接中提供的代码进行操作:https://developer.mozilla.org/en-US/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas,但因为来自CSS的样式导致图像出现错误。所以我建立了一个本地的CSS文件,并把它引入到SVG文件中,具体方法请参考:如何将样式应用于嵌入式SVG?,但似乎并没有成功引入样式表。你有什么想法或者建议吗?谢谢。
看一下PhantomJS - 你需要安装它,然后编写自己的脚本或运行类似以下代码:
phantomjs rasterize.js http://ariya.github.com/svg/tiger.svg tiger.png
您还可以保存为PDF,设置缩放等。
您可以使用html2canvas从任何dom元素(包括svg元素)生成画布。
但是,样式表中定义的svg元素的样式定义不会应用于生成的画布。这可以通过在调用html2canvas之前向svg元素添加样式定义来修补。
受this article的启发,我创建了这个:
function generateStyleDefs(svgDomElement) {
var styleDefs = "";
var sheets = document.styleSheets;
for (var i = 0; i < sheets.length; i++) {
var rules = sheets[i].cssRules;
for (var j = 0; j < rules.length; j++) {
var rule = rules[j];
if (rule.style) {
var selectorText = rule.selectorText;
var elems = svgDomElement.querySelectorAll(selectorText);
if (elems.length) {
styleDefs += selectorText + " { " + rule.style.cssText + " }\n";
}
}
}
}
var s = document.createElement('style');
s.setAttribute('type', 'text/css');
s.innerHTML = "<![CDATA[\n" + styleDefs + "\n]]>";
//somehow cdata section doesn't always work; you could use this instead:
//s.innerHTML = styleDefs;
var defs = document.createElement('defs');
defs.appendChild(s);
svgDomElement.insertBefore(defs, svgDomElement.firstChild);
}
// generate style definitions on the svg element(s)
generateStyleDefs(document.getElementById('svgElementId'));
// after generating the style defintions, call html2canvas
html2canvas(document.getElementById('idOfElement')).then(function(canvas) {
document.body.appendChild(canvas);
});
正如您提到的,“如何将样式应用于嵌入式SVG?”的示例应该可以工作。在测试代码时,您需要在此行代码中定义youObjectElement。
var svgDoc = yourObjectElement.contentDocument;
请再试一次。