首页 > 其他分享 >在前端生成H5二维码海报

在前端生成H5二维码海报

时间:2023-06-08 14:45:15浏览次数:50  
标签:海报 scale false canvas height width 二维码 var H5

海报图片生成前后端都能实现,个人喜欢在前端生成,主要是前端可以用html+css去实现海报样式,便于调试,对于熟悉前端代码的小伙伴来说再好不过。

以下是在vue项目中的实现,非vue前端同理。

思路及步骤:

1. 用html实现海报效果

制作海报模板图,用js二维码库生成二维码,用CSS的绝对定位实现二维码处于模板图上一层

2. 将html转canvas

用到第三方库html2canvas,npm install html2canvas

3. 将canvas转图片

用到第三方库canvas2image,这个库有点坑,它的源代码并没有实现模块化,然而却提交到了npmjs.com官网!!!无法直接引用其库,我是直接复制代码到项目中使用。

 

html部分

        <el-button type="primary" @click="toShare()" size="small" icon="el-icon-share">生成海报</el-button>

    <!-- 海报生成html模板,为了不让海报显示在页面上,使用绝对定位,且让其漂移到页面外很远的地方 -->
    <div id="posterHtml" class="posterHtml" style="width:390px;height:693px;position:absolute;top:-10000px;left:-10000px;">
      <img
        :src="'https://oss-exam.chanjet.com/ckt_html/poster_template/ec_poster.jpg'"
        crossorigin="anonymous"
        style="width:inherit;height:inherit;position:absolute;z-index: 10;"
      >
      <div style="width:inherit;height:inherit;position:absolute;z-index: 20;display: flex;flex-direction:column;justify-content: flex-start;align-items: center;">
        <div style="font-size:18px;position:absolute;top:30px;width:100%;text-align: left;color:#FFFFCC;text-shadow: 0 8px 10px #FFFFCC;">
          <div style="margin-left: 20px;font-family: 'Arial Black';">我们是【{{teamName}}】团队</div>
          <div style="margin-left: 20px;">正在参加“XX杯”XXXXXX大赛</div>
          <div style="margin-left: 20px;">请为我们的作品投一票吧~</div>
        </div>
        <!-- 二维码 -->
        <img id="posterQRCode" crossorigin="anonymous" style="width:200px;height:200px;position:absolute;top:420px;" />
      </div>
    </div>

    <!-- 分享海报生成后的图片弹窗 -->
    <el-dialog width="350px"   title="作品分享海报" v-if="posterVisible" :visible.sync="posterVisible" append-to-body>
      <div style="margin-top:-30px;display: flex;flex-direction:column;justify-content:center;align-items: center;">
        <div id="myPosterContainer" style="width:100%;display: flex;justify-content: center;align-items: center;"></div>
        <div style="line-height: 30px;">长按图片保存或转发</div>
      </div>
    </el-dialog>

 

js部分

method: {
    toShare() {
      const text = this.getHost() + '/#/2023ec/videoVote?videoInfoId=' + this.videoInfoId
      // 生成二维码
      QRCode.toDataURL(text, {
        width: 200,
        height: 200,
        src: ''
      }).then(url => {
        // <div style="margin:20px 0 20px 0"><img id="qrcode" :src="shortVideoQRCodeURL"/></div>
        document.querySelector('#posterQRCode').src = url
        this.createPoster()
        this.posterVisible = true
      }).catch(err => {
        console.error(err)
      })
    },
    createPoster() {
      // 生成海报
      const vm = this;
      const domObj = document.getElementById('posterHtml');
      var width = parseInt(domObj.style.width);
      var height = parseInt(domObj.style.height);
      var canvas = document.createElement('canvas');
      var scale = 1;
      canvas.width = width * scale;
      canvas.height = height * scale;
      canvas.getContext('2d').scale(scale, scale);
      var opts = {
        scale: scale,
        canvas: canvas,
        width: width,
        height: height,
        useCORS: true,
        allowTaint: false,
        logging: false,
        letterRendering: true
      };
      console.info('准备开始html2canvas')
      html2canvas(domObj, opts).then(function(canvas) {
        var context = canvas.getContext('2d');

        // 重要 关闭抗锯齿
        context.mozImageSmoothingEnabled = false;
        context.webkitImageSmoothingEnabled = false;
        context.msImageSmoothingEnabled = false;
        context.imageSmoothingEnabled = false;
        console.info('准备开始Canvas2Image')
        console.info('canvas2image:', Canvas2Image)
        var img = Canvas2Image.convertToImage(
          canvas,
          canvas.width,
          canvas.height
        );
        vm.postshow = false;
        vm.postcode = false;
        // img.style.width = canvas.width / 2 + 'px';
        img.style.width = '330px';
        // img.style.height = canvas.height / 2 + 'px';
        document.getElementById('myPosterContainer').appendChild(img);
      });
    },
}

 

标签:海报,scale,false,canvas,height,width,二维码,var,H5
From: https://www.cnblogs.com/jsper/p/17466402.html

相关文章

  • ch57x\ch58x开启仿真
    本次使用的平台是MounRiverStudio,使用的是WCH的CH582m与WCH-LinkE仿真之前确保LinkE处在Risc-V模式下 空闲时蓝灯常灭Step1:首先通过ISP工具开启两线仿真; Step2:点击下载选项会出来一个Debug的配置紧接着会出现再点击仿真开关即可。如果仍无法进入仿真:点击DebugCon......
  • CH58x\CH57x硬件SPI操作外部flash学习记录
    官方提供的58x的spi例程,spi主机模式下的发送方式有三种单字节发送,FIFO连续发送,DMA连续发送。本文分别对SPI0主机模式下三种发送模式进行使用。本次使用的是CH582m做为主机,W25Q64FV作为从机。一、单字节发送本次调试中实现对W25Q64FVflas进行读id,擦除,写入,读取。在进行主要操作......
  • 微信H5适配 解决微信调整字体大小导致Html5页面混乱
    最近开发公众号遇到一个问题:iOS、Android加载页面,如果用户调整了微信自带的字体大小,那么我们的页面就会跟随调整字体大小,导致页面错乱无法适配。所以希望能够禁止微信的字体放大功能。找了一些方法总结如下:原理:阻止ios和安卓调整字体大小时候的事件,ios通过添加css属性,安卓通过......
  • h5移动端页面调试工具Chii与 weinre 一样的远程调试工具
    与 weinre 一样的远程调试工具,主要是将webinspector替换为最新的 chromedevtoolsfrontend.电脑上跑一个chii服务,把对应的js嵌入h5页面内,用手机访问h5页面,chrome内看chii服务地址即可找到对应管理控制台  安装可以通过npm安装。npminstallchii-g 使用......
  • EasyCVR平台手机端H5页面系统名称过长导致显示异常的情况优化
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等。在测试中发现,EasyCVR平台手机端H5页面下,系统名......
  • EasyCVR平台手机端H5页面系统名称过长导致显示异常的情况优化
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等。在测试中发现,EasyCVR平台手机端H5页面下,系统名称......
  • 【HarmonyOS】一文教你如何在低代码项目中跳转H5页面
     【关键字】元服务、低代码、H5页面跳转、WebView【1、写在前面】今天我们来实现一个在低代码项目中通过按钮跳转到H5页面的功能,本项目是基于API6的JS工程,我们的实现思路是在页面B中通过Java加载WebView控件,在低码页面中为按钮绑定点击事件,事件中实现通过JS调用Java能力,OK,下面一起......
  • 【HarmonyOS】一文教你如何在低代码项目中跳转H5页面
    ​ 【关键字】元服务、低代码、H5页面跳转、WebView 【1、写在前面】今天我们来实现一个在低代码项目中通过按钮跳转到H5页面的功能,本项目是基于API6的JS工程,我们的实现思路是在页面B中通过Java加载WebView控件,在低码页面中为按钮绑定点击事件,事件中实现通过JS调用Java能力,O......
  • h5上传图片的两种方法
    上传方法一、ajax用formData对象上传介绍一下formData:FormData对象把数据编译成键值对的形式,用XMLHttpRequest来发送数据。注意:1.要将编码方式(enctype属性)设置成multipart/form-data2.不设置内容类型(contentType:false)3.不处理数据(processData:false)html代码:......
  • h5 audio播放声音
    h5audio播放声音http://www.niunan.net/test_audio.html <!DOCTYPEhtml><html><head><metaname="viewport"content="width=device-width,initial-scale=1.0"><metacharset="utf-8"/><......