const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
fetch('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAgMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTSA1IDAgTCAwIDUgTCA1IDEwIEwgMTAgNSBaIiAvPgo8L3N2Zz4=')
.then(response => response.text())
.then(text => {
let xmlDoc = new DOMParser().parseFromString(text,'text/xml');
changeAttribute(xmlDoc, '//svg:path', {fill:'red'});
changeAttribute(xmlDoc, '//svg:svg', {width:100, height:100});
insertIntoCanvas(xmlDoc);
});
function insertIntoCanvas(xmlDoc){
let file = new File([xmlDoc.rootElement.outerHTML], 'svg.svg', {
type: "image/svg+xml"
});
// and a reader
let reader = new FileReader();
reader.addEventListener('load', e => {
/* create a new image assign the result of the filereader
to the image src */
let img = new Image();
// wait for it to got load
img.addEventListener('load', e => {
// update canvas with new image
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(e.target, 0, 0);
});
img.src = e.target.result;
});
// read the file as a data URL
reader.readAsDataURL(file);
}
function changeAttribute(doc, xpath, obj) {
let r = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
let nodes = [];
let next = r.iterateNext();
while (next) {
nodes.push(next);
next = r.iterateNext();
}
nodes.forEach(node => {
Object.keys(obj).forEach(key => {
node.setAttribute(key, obj[key]);
});
});
}
function nsResolver(prefix) {
const ns = {
'xhtml': 'http://www.w3.org/1999/xhtml',
'svg': 'http://www.w3.org/2000/svg'
};
return ns[prefix] || null;
}
2条答案
按热度按时间p5fdfcr11#
加载SVG
你可以使用fetch函数来代替直接将SVG加载到图像元素中。这里是一个数据URL,仅作为示例--它可以被URL替换。此时你可以将SVG存储在一个变量中。
解析SVG
要修改SVG,一种方法是使用XPath,这是在函数changeAttribute()中发生的,该函数接受SVG、XPath表达式和包含要修改内容的数据的对象。
将SVG加载到图像元素中并在画布中呈现
当我读到你的问题时,你已经明白了这一点。在函数insertIntoCanvas()中,通过使用FileReader将SVG(XML文档)转换为数据URL。之后,图像被创建并绘制在画布上。
z3yyvxxp2#
您必须:
<style>
元素outerHTML
<canvas>
canvas.img
数据URI<canvas>
添加到shadowDOM或
replaceWith
执行此工作的Web组件<svg-to-canvas>
,所有现代浏览器都支持,它能为你做所有的事,所以你只写:
JSF中间:https://jsfiddle.net/WebComponents/cosfrqyv/
StackOverflow代码段: