我想获取一个 svg 并将其保存为 png(来自创建 svg 的图表插件),我想我已经想出了如何实现这一点......
我一直在寻找为什么 onload 函数没有触发,但我仍然不明白为什么下面的代码不起作用。你好没有显示。这可能非常简单,但我现在无法看到它......
jQuery(function ($) {
var svg = $("#visualizer-152").find('svg');
var imgsrc = 'data:image/svg+xml;base64,'+ btoa(svg);
var canvas = document.createElement("canvas");
var context = canvas.getContext("2d");
drawing = new Image();
//All above seems to work, no errors in console and objects
//seems to be created correctly
drawing.onload = function () {
alert('hello');
context.drawImage(drawing,0,0);
var base64 = canvas.toDataURL('image/png', 1);
};
drawing.src = imgsrc;
});
更新
将 onload 更改为,它似乎工作......
$( drawing ).load( "", function() {
context.drawImage(drawing,0,0);
var base64 = canvas.toDataURL('image/png', 1);
console.log('base64');
console.log(base64);
});
但现在另一个问题,我检索到这个错误:
未捕获的 InvalidStateError:无法在“CanvasRenderingContext2D”上执行“drawImage”:提供的 HTMLImageElement 处于“损坏”状态。
UPDATE2 如果我尝试单击控制台中生成的数据字符串:
var imgsrc = 'data:image/svg+xml;base64,'+ btoa(svg);
console.log(imgsrc);
我在控制台中得到这个字符串:
data:image/svg+xml;base64,W29iamVjdCBPYmplY3Rd
和浏览器中的这个错误:
此页面包含以下错误:
第 1 行第 1 列的错误:文档为空 下面是第一个错误之前的页面渲染。
UPDATE3: 我开始意识到实际问题,这是我无法正确获取源代码。我测试了手动将源设置为指向特定文件,然后它就可以工作了。通过查看生成的 svg 内容...(部分内容)
<div id="visualizer-152">
<div style="position: relative;">
<div dir="ltr" style="position: relative; width: 660px; height: 400px;">
<div aria-label="Ett diagram." style="position: absolute; left: 0px; top: 0px; width: 100%; height: 100%;">
<svg width="660" height="400" aria-label="Ett diagram." style="overflow: hidden;">
<defs id="defs">
<clipPath id="_ABSTRACT_RENDERER_ID_0">
<rect x="125" y="77" width="411" height="247"></rect></clipPath>
</defs><rect x="0" y="0" width="660" height="400" stroke="none" stroke-
width="0" fill="#ffffff"></rect>
并尝试一个明显有效的示例:(取自问题:How to convert svg to png using html5 canvas/javascript/jquery and save on server)
http://jsfiddle.net/epistemex/xfh7nctk/23/
在jsfiddle中,源码被outerHTML抓取:
var svgText = document.getElementById("myViewer").outerHTML;
和小提琴中的html ..(开始)
<div id="container" width=500px height=400px>
<svg class="svg-editor"
id="myViewer"
width="1400"
height="1400"
xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
style="overflow:scroll;margin:0;">
但在我的情况下它不起作用,因为 html 看起来不一样并且 svg 没有 id。我尝试向 SVG 添加一个 ID,尝试向 SVG 添加一个类但没有成功。我还尝试使用 wrap() - jQuery 中的函数创建包装器,但也没有成功: