使用svg绘制后下载svg内部嵌套image图片问题

svg里面包裹image标签,需求是将此svg转换为普通图片类型并将其下载到本地
1. 首先image图片地址转换为base64格式的才可以
  传入图片路径转为图片
const getImageUrlBase64 = (url) => {
        const img = new Image();
        img.crossOrigin = 'anonymous';//处理跨域,后端也要设置跨域处理才行
        img.src = url;
        img.onload = () => {
            console.log("成功")
            toBase64(img);
        }
    }
    getImageUrlBase64("./images/1/1.png")
 const toBase64 = (img) => {
        var canvas = document.createElement("canvas");
        canvas.width = 842;
        canvas.height = 595;
        var context = canvas.getContext("2d");
        context.fillStyle = "#fff"; // 设置保存后的PNG 是白色的
        context.fillRect(0, 0, 842, 595);
        context.drawImage(img, 0, 0, 842, 595);  //进行绘制图片
        var url = canvas.toDataURL("image/jpeg"); // 得到的base64编码
        newImgUrl = url;
        // console.log(newImgUrl, 'newImgUrlnewImgUrl')
        //var demoImg = document.getElementById("demoImg");
        //demoImg.setAttribute("href", newImgUrl)
    }
2.完成的html例子如下
​
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
     <svg width="842" height="595" version="1.1" xmlns:svgjs="http://svgjs.dev/svgjs" id="svgColumn" viewBox="0 0 842 595">
        <image id="demoImg" width="842" height="595" href="./images/1/1.png" x="0" y="0">              </image>
        <text dominant-baseline="central" text-anchor="start" id="page1" x="160.00" y="194.00"
          class="normal_text" svgjs:data="{&quot;leading&quot;:&quot;1.3&quot;}">
        <tspan class="simkai_font" font-size="18.00" font-weight="900" id="fromjz1Name">
背景图片上的文字1
        </tspan>
        <tspan class="simkai_fontstu" font-size="16.00" font-weight="900" id="fromjz1Title">背景图片上的文字1
         </tspan>
        </text>
   </svg>
    <button id="download">下载按钮</button>
</body>
<script>
 传入图片路径转为图片
const getImageUrlBase64 = (url) => {
        const img = new Image();
        img.crossOrigin = 'anonymous';//处理跨域,后端也要设置跨域处理才行
        img.src = url;
        img.onload = () => {
            console.log("成功")
            toBase64(img);
        }
    }
 getImageUrlBase64("./images/1/1.png")
 let newImgUrl = '';
 const toBase64 = (img) => {
        var canvas = document.createElement("canvas");
        canvas.width = 842;
        canvas.height = 595;
        var context = canvas.getContext("2d");
        context.fillStyle = "#fff"; // 设置保存后的PNG 是白色的
        context.fillRect(0, 0, 842, 595);
        context.drawImage(img, 0, 0, 842, 595);  //绘制图片
        var url = canvas.toDataURL("image/jpeg"); // 得到的base64编码
        newImgUrl = url;
        // console.log(newImgUrl, 'newImgUrlnewImgUrl')
        var demoImg = document.getElementById("demoImg");
        demoImg.setAttribute("href", newImgUrl)
    }
    let downEle = document.getElementById(`download`);
    downEle.addEventListener("click", function () {
        downloadpng();
    })
    function downloadpng() {
       let rootNode = document.getElementById('svgColumn');
       console.log(rootNode,'rootNode')
       const {width,height} = rootNode.getBoundingClientRect();
       console.log(width,height,'width==heught')
       covertSVGImage(rootNode,'test',width,height,'jpeg')
    }
   function covertSVGImage(node, name, width, height, type='png'){
       console.log('serializer','serializer')
      let serializer = new XMLSerializer();
      let source = '<?xml version="1.0" standalone="no"?>\r\n' + serializer.serializeToString(node);
      let image = new Image();
      let canvas = document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;
      let context = canvas.getContext('2d');
      context.fillStyle = '#fff';
      context.fillRect(0, 0, width, height);
      image.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source);
     console.log(image.src,'image.src')
     image.onload = function() {
    context.drawImage(image, 0, 0,width,height);
    let a = document.createElement('a');
    a.download = `${name}.${type}`;
    a.href = canvas.toDataURL(`image/${type}`);
    a.click();
  };
  }
</script>
</html>
​
3.因为图片需要跨域,在本地建了一个服务server.js 用git bash运行node server
内容如下
const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');

// 定义静态文件目录路径
const staticDirPath = './www'; // 这里假设静态文件存放在当前项目根目录下的 public 文件夹中
// 处理HTTP GET请求并返回对应的静态文件内容
function handleRequest(req, res) {
    const fileUrl = req.url; // 获取客户端发送过来的URL地址
    if (fileUrl === '/') {
        // 如果请求的是根路径(/)则默认返回index.html页面
        return sendFileContent(res, 'index.html', 'text/html');
    } else {
        // 否则按照URL地址去查找相应的静态文件并返回
        return sendFileContent(res, fileUrl);
    }
}

// 向客户端发送指定文件的内容
function sendFileContent(res, fileName, contentType = 'application/octet-stream') {
    const parsedUrl = url.parse(fileName, true); // true表示将查询字符串解析为对象
    const fileNames = parsedUrl.pathname; // 获取路径部分
    const filePath = path.join(__dirname, staticDirPath, fileNames); // 构造完整的文件路径
    console.log(filePath)
    try {
        const data = fs.readFileSync(filePath); // 同步读取文件内容
        res.writeHead(200, { 'Content-Type': contentType }); // 设置响应头部信息
        res.end(data); // 将文件内容作为响应体发送给客户端
    } catch (err) {
        console.error(`Error reading file ${fileName}:`, err);
        res.statusCode = 404; // 若无法找到文件则返回404错误状态码
        res.end();
    }
}

// 创建HTTP服务器并监听3000端口
const server = http.createServer((req, res) => {
    handleRequest(req, res);
}).listen(3000, () => {
    console.log('Static resource container is running on port 3000...');
});

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值