阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Canvas 绘制的图形保存时候加上二维码

      分析需求

      生成 Canvas 图,页面显示的图片上有提示长按保存图片的按钮。

      保存至手机相册时,需要拼上二维码,并去掉相关提示信息。

      主要做的有 2 点

      将 Canvas 图和二维码这两张图片合并成一张图片

      页面中显示的图片,与长按图片保存的是不一样的

      解决方案

      生成图片 A,同时用 canvas 绘制有二维码的图片 B,通过定位方式将 A、B 图重叠,并将 B 置顶,透明度为 0.01(不设置为 0, 在有些机器下有 bug)。

      这样可以做到页面显示的是 A 图,长按保存的是 B 图。

      canvas 绘图

      js 文件中动态创建 canvas

      let canvas = document.createElement('canvas')
      canvas.width = "700"
      canvas.height = "980"  //创建画布,并设置宽高
      //注意canvas元素本身并没有绘制能力(它仅仅是图形的容器
      //getContext()方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性
      let ctx = canvas.getContext("2d")
      ctx.rect(0,0, 700, 980) //矩形坐标,大小 (距离左上角x坐标,距离左上角y坐标,宽度,高度)
      ctx.fillStyle = "#fff" //矩形的颜色
      ctx.fill() //填充
      
      

      画布上绘制图像

      context.drawImage(image,x,y,w,h)
      

      x,y 为画布中画图的起始坐标,w,h 指绘制出来的图像的宽度与高度,比例与原图宽高最好一致,图像不会变形。

      这里需要注意一下,图片加载完成再调用 drawImage 绘图

      所以,定义了一个 promise 函数,当图片数据信息都加载完成后再调用 drawImage 绘图

      function loadImg(src) {
          let paths = Array.isArray(src) ? src : [src]
          let promise = paths.map((path) => {
              return new Promise((resolve, reject) => {
                  let img = new Image()
                  img.setAttribute("crossOrigin", 'anonymous')
                  img.src = path
                  //只是更新了DOM对象,图片数据信息还未加载完成,加载资源是异步执行的,需要监听load事件的,事件发生后,就能获取资源
                  img.onload = () => {
                      resolve(img)
                  }
                  img.onerror = (err) => {
                      alert('图片加载失败')
                  }
              })
            })
            return Promise.all(promise)
      }
      

      图片加载完成,调用 drawImage 绘图

      loadImg([
          'https://image.ibb.co/f4Lged/2017072615215296mg_ULNAVisju_Wh_D.jpg',
          'https://image.ibb.co/dkSoQJ/qrcode_for_gh_2039c29e81ca_430.jpg',
      ]).then(([img1, img2])=> {
          ctx.drawImage(img1, 0, 0, 400, 200) //画布上先绘制人物图`
          ctx.drawImage(img2, 250, 130, 60, 60) //再绘制二维码图,根据设计图设置好坐标。`
          imageURL = canvas.toDataURL("image/png") //获取图片合并后的data-URL,参数可选图片格式,图片质量,详自查API`
          let img3 = new Image()
          document.getElementsByClassName("box")[0].append(img3)
          img3.src = imageURL
          canvas.style.display = "none"
      });
      

      这样就将两张图片合成为一张图片了,然后可以利用 HTML5 a 标签 download 属性,也可以将其通过 img 标签展示到页面,然后长按 / 右键保存到本地。

      参考信息

      更多面试题

      如果你想了解更多的前端面试题,可以查看本站的WEB前端面试题 ,这里基本包涵了市场上的所有前端方面的面试题,也有一些大公司的面试图,可以让你面试更加顺利。

      面试题
      HTMLCSSJavaScript
      jQueryVue.jsReact
      算法HTTPBabel
      BootStrapElectronGulp
      Node.js前端经验相关前端综合
      Webpack微信小程序-

      这些题库还在更新中,如果你有不错的面试题库欢迎分享给我,我整理后放上来;人人为我,我为人人,互帮互助,共同提高,祝大家都拿到心仪的Offer!

      卖前端学习教程

      只需几十元,就能买到培训班的内部教程!开启高薪之路!

      零基础小白阿里P7的教程都有!

      同时长期收购所有培训班的前端教程

      目录
      目录