svg格式转为png格式并下载

//svg转为base64格式的svg
(url为<svg xml:space="preserve" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h18v18H0V0z" fill="none"/><path d="M3.6 11.3v3.1h3.1V16H2v-4.7h1.6zm12.4 0V16h-4.7v-1.6h3.1v-3.1H16zM6.7 2v1.6H3.6v3.1H2V2h4.7zM16 2v4.7h-1.6V3.6h-3.1V2H16zM9 4.5c2.5 0 4.5 2 4.5 4.5s-2 4.5-4.5 4.5-4.5-2-4.5-4.5 2-4.5 4.5-4.5zm0 1.3C7.2 5.8 5.8 7.2 5.8 9s1.4 3.2 3.2 3.2 3.2-1.4 3.2-3.2c0-1.8-1.4-3.2-3.2-3.2zM9 7c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2c0-.2 0-.4.1-.6.2.5.8.7 1.3.5s.7-.8.5-1.3c-.1-.2-.3-.4-.5-.5.2-.1.4-.1.6-.1z"/></svg>)
const imgUrl = (url: string) => {
  return 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(url)))
}


 //获取png格式的base64(id为获取图片宽高,img为图片)
const getImage=(img:any,id:any)=>{  
  const canvas = document.createElement('canvas');
    canvas.width = Number(document.getElementById(id)?.style.width.slice(0, -2))||30;  //设置好 宽高  不然图片 不完整
    canvas.height = Number(document.getElementById(id)?.style.height.slice(0, -2))||30;
    const context = canvas.getContext('2d');
    context.fillStyle = '#fff';//设置为底色
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.drawImage(img, 0, 0);    
    let ImgBase64 = canvas.toDataURL('image/png');
    return ImgBase64
}


//base64转为blob
const base64ToBlob = (code:any) => {
  var arr = code.split(',')
  // 图片格式
  var mime = arr[0].match(/:(.*?);/)[1]
  // 获取,之后的base64的编码
  var bstr = window.atob(arr[1])
  var n = bstr.length
  var u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}


//下载png
const downPng = (url: any, name: string, id: any) => {
  const img = new Image(); // 创建图片容器
  img.src = imgUrl(url); //imageBase64 为svg+xml的Base64 文件流
  img.onload = () => {
    var href = window.URL.createObjectURL(base64ToBlob(getImage(img, `wrap_${id}`)));
    var a = document.createElement('a');
    a.href = href;
    a.download = `${name}.png`;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(href);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值