【问题标题】:Export external SVG file painted with Javascript to PNG image将使用 Javascript 绘制的外部 SVG 文件导出为 PNG 图像
【发布时间】:2015-02-26 21:51:34
【问题描述】:

我正在使用来自外部文件的 svg 地图。我使用“object”标签将它插入到我的 html 代码中。

<object id="mymap" data="map.svg" width="884" height="760" type="image/svg+xml" ></object>

在 javascript 中,我用一些给定的颜色绘制 svg 地图的路径。例如:

<script>
var path1 = document.getElementById('mymap').getSVGDocument().getElementById('path1');
path1.style.fill='#f00';

var path2 = document.getElementById('mymap').getSVGDocument().getElementById('path2');
path2.style.fill='#0f0';
</script>

如何将生成的彩色地图导出为 PNG 图像?

--UPDATE-- :问题已得到解答,LiveExample 现在包含解决方案以供将来参考。您可以查看源代码并获取解决方案。该示例绘制地图并将绘制的地图保存在画布中,然后您可以将其另存为文件

【问题讨论】:

    标签: javascript html svg png


    【解决方案1】:

    解决方法如下: 根据我接受的解决方案,我包含了管理所有步骤的完整 javascript

    创建画布

    <canvas id="canvas" style="border:1px solid black;" width="884" height="760"></canvas>
    

    从绘制的 svg 中将图像绘制到该画布中

    function drawCanvas(){
        // create a canvas and context
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
    
    
        // define svgdocument and make blob containing its data
        var svgDoc = document.getElementById('mymap').getSVGDocument();
        var svg = new Blob([svgDoc.lastChild.outerHTML], {type: 'image/svg+xml;charset=utf-8'});
    
    
        // create a new image
        var DOMURL = window.URL || window.webkitURL || window;
        var url = DOMURL.createObjectURL(svg); 
        var img = new Image(); 
        img.onload = function(){ 
            ctx.drawImage(img,0,0,884,760); 
            DOMURL.revokeObjectURL(url);
        };
        img.src = url;
    }
    

    【讨论】:

      【解决方案2】:

      将svg绘制到画布上,然后使用.toDataURL获取PNG图像怎么样?

      --更新-- 为了快速测试,我在您的现场演示的控制台中运行以下命令:

      var canvas = document.createElement('canvas');
      var ctx = canvas.getContext('2d');
      var svgDoc = document.getElementById('mymap').getSVGDocument();
      var svg = new Blob([svgDoc.lastChild.outerHTML], {type: 'image/svg+xml;charset=utf-8'});
      var img = new Image(); 
      img.onload = function(){ ctx.drawImage(img,0,0); };
      img.src = url
      

      你应该看到有图像绘制的url,此时只需调用.toDataURL你应该得到base64图像数据

      【讨论】:

      • 我可以像我在初始帖子中展示的那样从外部文件中绘制到画布上吗?
      • 是的,你可以,quick example
      • 这取决于你想如何实现它。也可以将对象#mymap svg 内容绘制到画布上
      • 对不起,我昨天做错了。是的,你的想法是对的 :) 它应该是img.src = URL.createObjectURL(svg),它创建了一个 objectUrl 到img.src,然后它会触发绘制画布的 onload 函数.最后只有我们调用canvas.toDataURL("image/png")...为了触发下载,你可以调用window.location.href=canvas.toDataURL("image/png").replace("image/png", "image/octet-stream")...还有一件事,画布大小必须改变,默认是300x150。使用canvas.width/heigthimg.onload = function(){ ctx.drawImage(img,0,0,884,760); }; 进行更改
      • 我完成了实现。在我最初的问题中的实时示例中,我已经完全正常工作了。感谢您的帮助
      猜你喜欢
      • 2013-07-01
      • 2015-05-03
      • 1970-01-01
      • 2018-04-24
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      相关资源
      最近更新 更多