代码之家  ›  专栏  ›  技术社区  ›  Randy Voet

在HTML5画布上绘制SVG文件

  •  97
  • Randy Voet  · 技术社区  · 15 年前

    在HTML5画布上绘制SVG文件有默认方法吗?googlechrome支持将SVG作为图像加载(并且只需使用 drawImage resource interpreted as image but transferred with MIME type image/svg+xml .

    我知道一种可能是将SVG转换为canvas命令(如 this question

    5 回复  |  直到 9 年前
        1
  •  138
  •   Community Mohan Dere    6 年前

    编辑:2019年12月16日

    所有主流浏览器都支持Path2D now

    编辑:2014年11月5日

    ctx.drawImage 绘制具有.svg源的HTMLImageElements 在某些但不是所有浏览器中 . Chrome、IE11和Safari工作,Firefox可以处理一些bug(但是nightly已经修复了它们)。

    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";
    

    Live example here . 你应该在画布上看到一个绿色的正方形。页面上的第二个绿色正方形是相同的 <svg>

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

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

    Live example of that here.


    老后人回答:

    没有任何本机允许您在画布中本机使用SVG路径。你必须转换你自己或使用一个库来为你做这件事。

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

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

        2
  •  32
  •   Henrique Campos    8 年前

    抱歉,我没有足够的声誉来评论@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
    
    <svg height="40">
      <rect width="40" height="40" style="fill:rgb(255,0,255);" />
      <image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEX0lEQVQ4jUWUyW6cVRCFv7r3/kO3u912nNgZgESAAgGBCJgFgxhW7FkgxAbxMLwBEmIRITbsQAgxCEUiSIBAYIY4g1EmYjuDp457+Lv7n+4tFjbwAHVOnVPnlLz75ht67OhhZg/M0p6d5tD9C8SNBBs5XBJhI4uNLC4SREA0UI9yJr2c4e6QO+v3WF27w+rmNrv9Pm7hxDyHFg5yYGEOYxytuRY2SYiSCIwgRgBQIxgjEAKuZWg6R9S0SCS4qKLZElY3HC5tp7QPtmlMN7HOETUTXBJjrEGsAfgPFECsQbBIbDGJZUYgGE8ugQyPm+o0STtTuGZMnKZEjRjjLIgAirEOEQEBDQFBEFFEBWLFtVJmpENRl6hUuFanTRAlbTeZarcx0R6YNZagAdD/t5N9+QgCYAw2jrAhpjM3zaSY4OJGTDrVwEYOYw2qioigoviq5MqF31m9fg1V5fCx+zn11CLNVnufRhBrsVFE1Ihpthu4KDYYwz5YQIxFBG7duMZnH31IqHL6wwnGCLFd4pez3/DaG2/x4GNPgBhEZG/GGlxkMVFkiNMYay3Inqxed4eP33uf7Y0uu90xWkGolFAru7sZn5w5w921m3u+su8vinEO02hEWLN/ANnL2rkvv2an2yd4SCKLM0JVBsCgAYZZzrnPP0eDRzXgfaCuPHXwuEYjRgmIBlQVVLl8/hKI4fRzz3L6uWe5+PMvnHz6aa4uX+D4yYe5vXaLH86eoyoLjLF476l9oKo9pi5HWONRX8E+YznOef7Vl1h86QWurlwjbc+QpikPPfoIcZLS39pmMikp8pzae6q6oqgriqrGqS+xeLScoMYSVJlfOMTl5RXW1+5w5fJVnFGWf1/mxEMnWPppiclkTLM5RdJoUBYFZVlQ5DnZMMMV167gixKLoXXsKGqnOHnqOJ/+/CfZ+XUiZ0jTmFv5mAvf/YjEliQ2vPD8Ir6qqEcZkzt38cMRo5WruFvfL9FqpyRxQhj0qLOax5I2S08+Tu/lFiGUGOPormxwuyfMnjrGrJa88uIixeYWl776lmrzNjmw8vcG8sU7ixpHMXFsCUVg9tABjEvRgzP82j7AhbyiX5Qcv2+Bvy7dYGZ1k7efeQB/Y4PBqGBtdYvb3SFzLcfqToZc/OB1zYeBSpUwLBlvjZidmWaSB1yaYOfn6LqI/r0hyU6P+cRSlhXjbEI2zvnt7y79oqQ3qeg4g6vKjCIXehtDmi6m0UnxVnCRkPUHVNt9qkLJxgXOCYNOg34v48raPaamU2o89/KKsQ9sTSpc0JK7NwdcX8s43Ek5cnSOLC/Z2R6Rj0ra0w2W1/t0xyWn51uk2Ri1QtSO6OU5d7OSi72cQeWxKG7p/Dp//JXTy6C1Pcbc6DMpPRtjTxChEznWhwVZUCKrjCrPoPDczHLmnLBdBgZlRRWUEBR3ZKrme5TlrTGlV440Y1IrXM9qQGi6mkG5V6uza7tUIeCDElTZ1L26elX+fcH/ACJBPYTJ4X8tAAAAAElFTkSuQmCC" height="20px" width="20px" x="10" y="10"></image>
    </svg>
    <hr/><br/>
    
    IMAGE
    <img/>
    <hr/><br/>
       
    CANVAS
    <canvas></canvas>
    <hr/><br/>
        3
  •  25
  •   Crashalot    6 年前

    你可以简单地画 svg 通过以下方式将图像绘制到画布上:

    1. 将图像绘制到画布上

    该方法的唯一缺点是无法绘制嵌入到图像中的图像 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
    
    <svg height="40">
      <rect width="40" height="40" style="fill:rgb(255,0,255);" />
      <image xlink:href="https://en.gravatar.com/userimage/16084558/1a38852cf33713b48da096c8dc72c338.png?size=20" height="20px" width="20px" x="10" y="10"></image>
    </svg>
    <hr/><br/>
    
    IMAGE
    <img/>
    <hr/><br/>
       
    CANVAS
    <canvas></canvas>
    <hr/><br/>
        4
  •  6
  •   GʀᴜᴍᴘʏCᴀᴛ    10 年前

    Mozilla有一种在画布上绘制SVG的简单方法叫做 Drawing DOM objects into a canvas "

        5
  •  6
  •   sampathsris Rihards Fridrihsons    7 年前

    正如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公司以及RGB颜色.js. 它们允许您在JavaScript函数中通过URL或在SVG标记之间使用内联SVG代码来操作和加载SVG。

    推荐文章