3 回答

TA貢獻1804條經驗 獲得超7個贊
對于嵌入式SVG,您需要:
將SVG字符串轉換為 Blob
獲取Blob的URL
創建圖像元素并將URL設置為 src
加載(onload)后,您可以將SVG繪制為畫布上的圖像
用于toDataURL()從畫布獲取PNG文件。
例如:
function drawInlineSVG(ctx, rawSVG, callback) {
var svg = new Blob([rawSVG], {type:"image/svg+xml;charset=utf-8"}),
domURL = self.URL || self.webkitURL || self,
url = domURL.createObjectURL(svg),
img = new Image;
img.onload = function () {
ctx.drawImage(this, 0, 0);
domURL.revokeObjectURL(url);
callback(this);
};
img.src = url;
}
// usage:
drawInlineSVG(ctxt, svgText, function() {
console.log(canvas.toDataURL()); // -> PNG data-uri
});
當然,此處的console.log僅作為示例。請在此處存儲/傳輸字符串。(我也建議onerror在方法內部添加一個處理程序)。
另外,請記住使用width和height屬性設置畫布大小,或者使用屬性從JavaScript 設置畫布大小。

TA貢獻1887條經驗 獲得超5個贊
我很久以后才提出這個問題,因為接受的答案可能會產生不良行為。
@ K3N解決方案幾乎是正確的,但我反對使用svgElement.outerHTML。
相反,應該更喜歡new XMLSerializer().serializeToString(svgElement)。
同樣,也不需要使用Blob和URL API,并且簡單的dataURI在瀏覽器中具有更大的兼容性。
這樣的完整版本是:
function drawInlineSVG(svgElement, ctx, callback){
var svgURL = new XMLSerializer().serializeToString(svgElement);
var img = new Image();
img.onload = function(){
ctx.drawImage(this, 0,0);
callback();
}
img.src = 'data:image/svg+xml; charset=utf8, '+encodeURIComponent(svgURL);
}
//usage :
drawInlineSVG(document.querySelector('svg'), ctxt, function(){console.log(canvas.toDataURL())})

TA貢獻1757條經驗 獲得超7個贊
這不是CORS問題。一些UA在畫布上繪制某些svg元素時具有安全限制。這在哪個瀏覽器上發生?如果IE <Edge,則所有svg都會污染畫布。唯一的解決方法:使用畫布繪制方法重現svg(這是canvg之類的庫所執行的操作)。對于其他UA,您的svg中可能有一個foreignObject元素。不幸的是,Safari和chrome在某些情況下并不真正喜歡它,除了刪除此元素或將其替換為ots內容上的html2canvas結果之外,沒有其他解決方法。
添加回答
舉報