当前位置:  开发笔记 > 编程语言 > 正文

在HTML5画布上绘制SVG文件

如何解决《在HTML5画布上绘制SVG文件》经验,为你挑选了5个好方法。

是否有将SVG文件绘制到HTML5画布上的默认方式?谷歌浏览器支持将SVG加载为图像(并简单地使用drawImage),但开发人员控制台确实警告过resource interpreted as image but transferred with MIME type image/svg+xml.

我知道有可能将SVG转换为canvas命令(比如这个问题),但我希望不需要.我不关心旧的浏览器(所以如果FireFox 4和IE 9支持某些东西,那就足够了).



1> Simon Sarris..:
编辑2014年11月5日

您现在可以使用在某些但不是所有浏览器中ctx.drawImage绘制具有.svg源的HTMLImageElements .Chrome,IE11和Safari工作,Firefox可以处理一些错误(但每晚修复它们).

var img = new Image();
img.onload = function() {
    ctx.drawImage(img, 0, 0);
}
img.src = "http://upload.wikimedia.org/wikipedia/commons/d/d2/Svg_example_square.svg";

这里有实例.你应该在画布上看到一个绿色方块.页面上的第二个绿色方块是插入DOM中的相同元素以供参考.

您还可以使用新的Path2D对象绘制SVG(字符串)路径(仅适用于Chrome).换句话说,你可以写:

var path = new Path2D('M 100,100 h 50 v 50 h 50');
ctx.stroke(path);

这里的实例.


老后人回答:

没有任何本机允许您在画布中本机使用SVG路径.您必须转换自己或使用库为您完成.

我建议你去看看canvg:

http://code.google.com/p/canvg/

http://canvg.googlecode.com/svn/trunk/examples/index.htm


注意:由于长期存在的FireFox Bug,遗憾的是,缺少宽度和高度标签的svgs将无法在画布上呈现.此外,宽度和高度不得为百分比.
为什么需要这个?SVG似乎完美地画在一个只有'drawImage`的画布上.但我仍然得到那个警告.它从何而来?
维基媒体似乎并不喜欢你使用SVG.我交换了http://snapsvg.io/assets/images/logo.svg作为我找到的第一个可用的SVG.在FF工作.http://jsfiddle.net/Na6X5/331/

2> Matyas..:

您可以svg通过以下方式在画布上轻松绘制简单的s:

    将svg的源分配为base64格式的图像

    将图像绘制到画布上

注意:该方法唯一的反向是它无法绘制嵌入的图像svg.(见演示)

示范:

(请注意,嵌入的图像仅在其中可见svg)

var svg = document.querySelector('svg');
var img = document.querySelector('img');
var canvas = document.querySelector('canvas');

// get svg data
var xml = new XMLSerializer().serializeToString(svg);

// make it base64
var svg64 = btoa(xml);
var b64Start = 'data:image/svg+xml;base64,';

// prepend a "header"
var image64 = b64Start + svg64;

// set it as the source of the img element
img.src = image64;

// draw the image onto the canvas
canvas.getContext('2d').drawImage(img, 0, 0);
svg, img, canvas {
  display: block;
}
SVG


  
  



IMAGE

CANVAS



3> Henrique Cam..:

对不起,我没有足够的声誉评论@Matyas答案,但如果svg的图像也在base64中,它将被绘制到输出.

演示:

var svg = document.querySelector('svg');
var img = document.querySelector('img');
var canvas = document.querySelector('canvas');

// get svg data
var xml = new XMLSerializer().serializeToString(svg);

// make it base64
var svg64 = btoa(xml);
var b64Start = 'data:image/svg+xml;base64,';

// prepend a "header"
var image64 = b64Start + svg64;

// set it as the source of the img element
img.onload = function() {
    // draw the image onto the canvas
    canvas.getContext('2d').drawImage(img, 0, 0);
}
img.src = image64;
svg, img, canvas {
  display: block;
}
SVG


  
  



IMAGE

CANVAS



4> Nati Krisi..:

Mozilla有一种在画布上绘制SVG的简单方法,称为"将DOM对象绘制到画布中 "



5> Max West..:

正如Simon所说,使用drawImage应该行不通。但是,使用canvg库和:

var c = document.getElementById('canvas');
var ctx = c.getContext('2d');
ctx.drawSvg(SVG_XML_OR_PATH_TO_SVG, dx, dy, dw, dh);

这来自Simon上面提供的链接,其中包含许多其他建议,并指出您要链接到或下载canvg.js和rgbcolor.js。这些允许您通过URL或在JavaScript函数中使用svg标签之间的内联SVG代码来操纵和加载SVG。

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有