js如何生成携带动态信息的图片

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
</head>
<body>
<div id="view" style="display: none;">
    <div id="div">
        <p>balabalabala</p>
    </div>
    <img src="./erwei.jpg" alt="" id="img1">
    <img src="./123.jpg" alt="" id="img2">
</div>
<canvas id="myCanvas" width="750" height="2280"></canvas>
<script>
    //将文字信息转化为图片
    var divContent = document.getElementById("div").innerHTML;
    var data = "data:image/svg+xml," + "<svg xmlns='http://www.w3.org/2000/svg' width='100' height='45'>" + "<foreignObject width='100%' height='100%'>" + "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:16px;font-family:Helvetica'>" +                 divContent + "</div>" + "</foreignObject>" + "</svg>";
    var img = new Image();
    img.src = data;
    img.id="name";
    document.getElementsByTagName('body')[0].appendChild(img);
    document.getElementById("name").style.display="none";
    // 将图片插入canvas
    document.getElementById("img2").onload=function(){
        var c=document.getElementById("myCanvas");
          var ctx=c.getContext("2d");
          var img1=document.getElementById("img1");
          var img2=document.getElementById("img2");
          var img3=document.getElementById("name");
          ctx.drawImage(img1,150,0,200,200);
          ctx.drawImage(img3,350,0,100,45);
          ctx.drawImage(img2,0,200,750,2080);
    }
    //canvas转化成png
        var image = new Image();
        img.setAttribute('crossOrigin', 'anonymous');
        image.src = document.getElementById("myCanvas").toDataURL("image/png");
        document.getElementsByTagName('body')[0].appendChild(image);
</script>
</body>
</html>

我拿到一个长图,需要将后台生成的二维码还有用户ID之类的东西拼在一起,然后让用户长按下载后给别人扫;
我用canvas将三块内容拼在一起,但是canvas要实现自适应又会让图片失真,就想将canvas转化成png再显示在页面上。

1.我现在卡在将canvas转化成png这边,最后转出来的图是一个空白的图片;

2.我想是不是因为canvas还没有画完的原因,把最后部分放在onload里面执行又显示图片跨越,始终解决不了

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
at HTMLImageElement.document.getElementById.onload (file:///C:/Users/Administrator/Desktop/test2.html:44:52)

3.有没有canvas以外的方法实现这个功能?

阅读 3.6k
1 个回答
createImage () {
      const image = new Image()
      image.crossOrigin = 'Anonymous'
      image.onload = () => {
        //创建Canvas
        const area = document.createElement('canvas')
        area.width = 620
        area.height = 920
        const cxt = area.getContext('2d')
        cxt.scale(2, 2)
        cxt.fillStyle = '#ffffff'
        cxt.fillRect(0, 0, area.width, area.height)
        console.log(image.width)
        //先把载入的图片画到canvas上
        cxt.drawImage(image, 5, 5, 300, 300)

      // `console.info(window.location.href)
          let url = window.location.href
          if(this.options.itemUrl !==null){
              url = this.options.itemUrl
          }
          console.info(window.location.search)
          if(window.location.search){
              url =url +'&frompic=1'
          } else {
              url = url + '?frompic=1'
          }
          console.info(url)
          //把URL生成二维码
        const qr = new QRious({
          background: '#fff',
          backgroundAlpha: 0.8,
          foreground: '#000',
          foregroundAlpha: 1,
          level: 'H',
          padding: 5,
          size: 500,
          value: url
        })
        
        //把生成的二维码画到canvas上
        cxt.drawImage(qr.canvas, 5, 310, 110, 110)


        //下面全是画一起文字信息,不解释了
        cxt.font = '11px 微软雅黑 bold'
        cxt.fillStyle = '#000'

        // cxt.fillText(this.options.itemname, 120, 320)
        this.canvasTextAutoLine(this.options.itemname, area, 120, 320, 15)

        if(this.options.coupondeno !==null){
            cxt.font = '11px 微软雅黑 normal'
            cxt.fillStyle = '#ff0000'
            cxt.fillText(`领券:${this.options.coupondeno} 元`, 120, 360)
        

            cxt.font = 'italic 11px 微软雅黑 normal'
            cxt.fillStyle = '#0000ff'
            cxt.fillText(`原价:${this.options.itemprice}`, 120, 380)

            cxt.font = '20px 微软雅黑 bold'
            cxt.fillStyle = '#ff0000'
            const str = `券后价:${this.options.curprice} 元`
            cxt.fillText(str, 120, 410)

            
        } else {
            cxt.font = '20px 微软雅黑 bold'
            cxt.fillStyle = '#ff0000'
            const str = `仅售:${this.options.itemprice} 元`
            cxt.fillText(str, 120, 410)
        }

        cxt.font = '20px 微软雅黑'
        cxt.fillStyle = '#000000'
        cxt.fillText('长按扫码,先领券再购物', 40, 450)
        // this.shareimg = area.toDataURL('image/png')
        // console.log(this.shareimg)
        let shareimg = new Image()
        shareimg.src= area.toDataURL('image/png')

        this.el.append(shareimg)
      }
      image.src = this.options.img
      
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题