原文:http://techslides【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】.com/save-svg-as-an-本文作者:唐霜,转载请注明出处。【本文受版权保护】image
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【作者:唐霜】SVG超赞,但是有的时候你想把它转换为其本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】他的图片格式,比如jpg或png。如果你【作者:唐霜】本文版权归作者所有,未经授权不得转载。用d3.js创建了一些图表,你可以提供把【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。这些图表保存为图片格式的选项。网上晃了一【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net圈,我最后找到了这篇文章《Save SVG as PNG【本文受版权保护】》。虽然它提供了一种解决问题的还不错的方【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】案,但我还是想把它扩展一下,以提供更多的本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】可选方案。
【转载请注明来源】原创内容,盗版必究。转载请注明出处:www.tangshuang.net【作者:唐霜】转载请注明出处:www.tangshuang.net最开始,我想举个栗子,你用D3创建了一些【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net图,然后想用一个button和一个js函本文作者:唐霜,转载请注明出处。【作者:唐霜】数来实现svg到图片的格式转换。我想你有【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。三种选择来实现这个展示图片的需求:一,直本文版权归作者所有,未经授权不得转载。【转载请注明来源】接用svg作为dataurl的img标签未经授权,禁止复制转载。【本文首发于唐霜的博客】,这当然还是一个技术上的svg,没啥区别【本文受版权保护】本文版权归作者所有,未经授权不得转载。;二,用html5 canvas把svg【本文受版权保护】【本文受版权保护】转换为png,然后插入一个base64 【转载请注明来源】转载请注明出处:www.tangshuang.netdata到一个img标签;三,把svg转【本文受版权保护】原创内容,盗版必究。换为png的二进制数据形式,把数据加载到【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】一个blob url,这样你可以在一个i【本文受版权保护】【转载请注明来源】mg标签内提供一个真实的图片文件。
本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】原创内容,盗版必究。让我们从一个原创内容,盗版必究。d3的例子著作权归作者所有,禁止商业用途转载。开始。我稍微改了一下代码,把svg的内容著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】放到一个div而不是body里面,我还加【作者:唐霜】【作者:唐霜】了“保存图片”的按钮,以及前面提到的js【本文首发于唐霜的博客】未经授权,禁止复制转载。函数。你可以看这里【版权所有,侵权必究】演示。下面是这个实现的关键代码:【转载请注明来源】
本文版权归作者所有,未经授权不得转载。【本文受版权保护】未经授权,禁止复制转载。d3.select("#save").on("click", function(){
var html = d3.select("svg")
.attr("version", 1.1)
.attr("xmlns", "http://www.w3.org/2000/svg")
.node().parentNode.innerHTML;
//console.log(html);
var imgsrc = 'data:image/svg+xml;base64,'+ btoa(html);
var img = '<img src="'+imgsrc+'">';
d3.select("#svgdataurl").html(img);
});
我们抓取d3生成的svg,把它转换为ba原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】se64的dataurl形式,把它黏贴到【版权所有,侵权必究】【本文首发于唐霜的博客】一个img标签。这个时候它还是一个svg转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】,我们把它加载到一个真实的图片里面,再把【原创内容,转载请注明出处】未经授权,禁止复制转载。这个图片加载到canvas对象中。这个时【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。候,我们可以从canvas抓取png的d【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。ataurl,并且把它插入到页面中的im【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。g标签上。
【本文首发于唐霜的博客】未经授权,禁止复制转载。未经授权,禁止复制转载。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net现在我们有了一个带base64加密的图片【未经授权禁止转载】【本文首发于唐霜的博客】数据资源的真实的png图片了。再用HTML5 link download 【未经授权禁止转载】原创内容,盗版必究。attribute,我们就可以以编程的方式强制浏览器下载这【原创不易,请尊重版权】【原创内容,转载请注明出处】个图片。这里就是最终的实现未经授权,禁止复制转载。。来看看核心代码:【关注微信公众号:wwwtangshuangnet】
转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。d3.select("#save").on("click", function(){
var html = d3.select("svg")
.attr("version", 1.1)
.attr("xmlns", "http://www.w3.org/2000/svg")
.node().parentNode.innerHTML;
var imgsrc = 'data:image/svg+xml;base64,'+ btoa(html);
var img = '<img src="'+imgsrc+'">';
d3.select("#svgdataurl").html(img);
// 上面和前面的实现是一样的
var canvas = document.querySelector("canvas"),
context = canvas.getContext("2d");
var image = new Image;
image.src = imgsrc;
image.onload = function() {
context.drawImage(image, 0, 0);
var canvasdata = canvas.toDataURL("image/png");
var pngimg = '<img src="'+canvasdata+'">';
d3.select("#pngdataurl").html(pngimg);
var a = document.createElement("a");
a.download = "sample.png";
a.href = canvasdata;
document.body.appendChild(a);
a.click();
};
});
现在,这个方案已经够酷了,特别是你能通过【本文受版权保护】【版权所有】唐霜 www.tangshuang.net编程的形式强制下载图片文件。但是,怎么实【本文首发于唐霜的博客】【作者:唐霜】现在客户端创建一个真实的图片呢?(译者按未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。:意思是说不需要经过服务端,用户提供一个著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。svg,直接导出一个png。)我们可以用本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】一个blob来保存图片数据,然后把它丢到【转载请注明来源】【原创内容,转载请注明出处】一个blob url。我以前在我的文章Drag and Drop Image 【作者:唐霜】著作权归作者所有,禁止商业用途转载。Upload to Imgur和【原创不易,请尊重版权】Making Video Screens著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。hots with HTML5中搞定过blobs转换,但是那段代码必须【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。使用html5的FileReader的相【原创内容,转载请注明出处】未经授权,禁止复制转载。关功能,但现在我们只需要把图片数据转换到著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。一个atob【作者:唐霜】和【未经授权禁止转载】DataView【本文受版权保护】的二进制格式中。原创内容,盗版必究。这里【本文首发于唐霜的博客】是我实现的最终效果。【未经授权禁止转载】
【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net最后,让我们完成一个著作权归作者所有,禁止商业用途转载。拖拽放入SVG生成PNG图片转换器本文作者:唐霜,转载请注明出处。,你可以查看这个页面的源代码来查看它是怎【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。样实现的。
转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】
其他参考:【访问 www.tangshuang.net 获取更多精彩内容】
- Save SVG as PNG本文版权归作者所有,未经授权不得转载。 【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有,侵权必究】
- Canvg【版权所有,侵权必究】 转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【原创不易,请尊重版权】【转载请注明来源】
- SVG Crowbar本文版权归作者所有,未经授权不得转载。 – Chrome特殊标签栏,它能够从h【未经授权禁止转载】原创内容,盗版必究。tml文档中提取svg元素并且包含它的所【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】有样式,然后下载它们保存为一个svg图片【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】。 【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】
注:a标签的download属性支持情况著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。(来自MDN):
【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】原创内容,盗版必究。| Feature转载请注明出处:www.tangshuang.net | Chrome【访问 www.tangshuang.net 获取更多精彩内容】 | Edge原创内容,盗版必究。 | Firefox (Gecko)【本文受版权保护】 | Internet Explorer【关注微信公众号:wwwtangshuangnet】 | Opera【访问 www.tangshuang.net 获取更多精彩内容】 | Safari未经授权,禁止复制转载。 |
|---|---|---|---|---|---|---|
| download本文版权归作者所有,未经授权不得转载。 | 14【本文首发于唐霜的博客】 | (Yes)【原创不易,请尊重版权】 | 20.0 (20.0)转载请注明出处:www.tangshuang.net | Edge 13【作者:唐霜】 | 15未经授权,禁止复制转载。 | 10.1本文作者:唐霜,转载请注明出处。 |
另外,这是我第一次完整的翻译一篇文章,不【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】求翻译精准,但求读者能够准确读懂。如果你【未经授权禁止转载】【本文受版权保护】觉得这篇文章有用,请为你的收获打赏,让我【本文受版权保护】【关注微信公众号:wwwtangshuangnet】坚持翻译更多好文章。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net2017-05-17 18303



[…] 在《将SVG保存为图片[译]》一文中介绍了一种将svg保存为图片保存到本地的一种方案。但是这篇文章里面,还存在一个问题,它使用了a标签的download属性。这个属性并不能支持版本较低(9)的IE。本文更进一层,不仅导出svg,连html也可以导出保存的方案。 […]