我想抓住一个svg并将其保存为png(来自创建svg的Chart插件),我想我已经弄清楚如何实现这个...
我一直在寻找为什么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:无法执行' drawImage'上 ' CanvasRenderingContext2D':提供的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中,sourceHTML抓住了源:
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中添加一个类但没有成功。我也尝试在jQuery中使用wrap()函数创建包装器,但也没有成功:
答案 0 :(得分:1)
这是你在小提琴中开始的变化,它似乎对我有用。这里缺少的是你必须使用画布大小来匹配你的图像,但你明白了。
var container = document.getElementById('container');
var svgText = document.getElementById("myViewer").outerHTML;
var myCanvas = document.getElementById("canvas");
var ctxt = myCanvas.getContext("2d");
var DOMURL = window.URL || window.webkitURL || window;
var svg = new Blob([svgText], {type: 'image/svg+xml;charset=utf-8'});
var url = DOMURL.createObjectURL(svg);
var img = new Image();
img.onload = createPNG;
img.src = url;
function createPNG() {
ctxt.drawImage(img, 0, 0);
var canvasData = myCanvas.toDataURL('image/png');
// For the download button you can use one you have on your HTML
// or create one like this. Notice the download attribute where you can name your file.
// https://developer.mozilla.org/en/docs/Web/HTML/Element/a#Using_the_download_attribute_to_save_a_canvas_as_a_PNG
var saveBtn = document.createElement('a');
saveBtn.href = canvasData;
saveBtn.textContent = 'Download PNG';
saveBtn.download = 'FILENAME.png';
DOMURL.revokeObjectURL(url);
container.appendChild(saveBtn);
}
修改强>
要选择没有ID的svg,您可以使用querySelector
查询任何特定元素。尝试使用以下代码替换前两行:
var container = document.getElementById('visualizer-152');
var svgText = container.querySelector('svg').outerHTML;
querySelector()
只会返回它找到的第一个svg
元素。如果您有多个SVG,则可以使用querySelectorAll()
,它将返回所有svg
元素的数组。