h5如何实现页面生成海报 & 保存图片及分享到微信/朋友圈功能

16 篇文章 0 订阅

知识点:

  1. 使用html2canvas实现移动端H5页面截图
  2. 实现canvas图片转为文件
  3. 阿里云文件上传功能
  4. .……
  5. HTMLCanvasElement.toDataURL()
  6. DataURL与File,Blob,canvas对象之间的互相转换的Javascript

template:

<template>
  <div class="letter_box" id="shareContainer" :style="{ height: height ? height + 'px' : '100vh' }">
  <!-- 头部logo -->
    <div class="header" v-show="isShowHeader" id="header">
      <div class="logo_box">
        <img src="@/common/images/logo@2x.png" alt="" />
      </div>
    </div>
    <div class="main">
      <!-- 重新播放 &  分享按钮 -->
      <div id="share_outer" v-if="isShowShareBtn" class="share_outer">
        <img src="@/common/imgs/17-replay@2x.png" alt="" @click="replay" />
        <img src="@/common/imgs/17-share@2x.png" alt="" @click="handleShare" />
      </div>
      <!-- 二维码区域 -->
      <div class="rqcode_box" v-show="isShowRqcode" id="rqcode_box">
        <div class="rqcode">
          <img src="@/common/imgs/xh_code.png" alt="" />
        </div>
        <div class="rqword">
          <p class="lh33">扫一扫</p>
          <p class="lh33">查收你的个人年报</p>
        </div>
      </div>
    </div>
    <!-- 分享弹窗 -->
    <van-share-sheet
      class="share_box" title="" v-model="showShare"
      :options="options" @select="onSelect" @cancel="onCancel"
    />
  </div>
</template>
<script>
import ossUpload from '@/mixins/ossUpload'; // 没用到
import html2canvas from 'html2canvas';
import OSS from 'ali-oss';
import { commonCall } from '@/common/js/mUtils';
export defaultv{
	mixins: [ossUpload],  // 没用到
	data() {
		return {
			  url: '', // 图片地址
		      ossConfig: {},
		      imgTypes: ['jpg', 'png', 'gif', 'bmp'],
		      showShare: false, // 是否展示分享弹窗
		      isShowRqcode: false, // 是否展示二维码
		      isShowShareBtn: true, // 是否展示分享按钮
		      isShowHeader: false, // 是否展示头部
      options: [
        {
          name: '保存图片',
          type: '2',
          icon:
            'http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1609815463993/undefined'
        },
        {
          name: '微信',
          type: '1',
          icon:
            'http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1609815451747/undefined'
        },
        {
          name: '朋友圈',
          type: '0',
          icon:
            'http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1609815438058/undefined'
        }
      ],
		}
	},
  created() {
    //触发获取OSS服务器的token(文件上传)
    this.getOssConfig();
  },
  methods:{
  // oss配置
    getOssConfig() {
      this.$api.getOssToken().then((res) => {
        this.ossConfig = {
          stsToken: res.body.SecurityToken,
          accessKeyId: res.body.AccessKeyId,
          accessKeySecret: res.body.AccessKeySecret,
          bucket: res.body.bucket,
          region: res.body.region.split('.')[0]
        };
      });
    },
  }
}

//dataURL转化为file对象

   dataURLtoFile(dataurl, filename) {
     let arr = dataurl.split(',');
     let mime = arr[0].match(/:(.*?);/)[1];
     let bstr = atob(arr[1]);
     let n = bstr.length;
     let u8arr = new Uint8Array(n);
     while (n--) {
       u8arr[n] = bstr.charCodeAt(n);
     }
     //转换成file对象
     return new File([u8arr], filename, { type: mime });
     //转换成成blob对象
     //return new Blob([u8arr],{type:mime});
   },

//点击分享,生成海报

    handleShare() {
      let _this = this;
      // 有链接则打开弹窗
      if (_this.url) {
        this.showShare = true;
        return;
      }
      
      let client = new OSS(this.ossConfig);
      // 获取需要截屏的容器
      let id = document.getElementById('shareContainer');
      // loading状态
      this.$Toast.loading({
        mask: true,
        message: '请稍等...',
        duration: 0
      });
      html2canvas(id, {
      // 一些配置
        backgroundColor: null,
        // 有哪些页面上存在,但是不想展示在截图的海报上面的,可以ignore忽略这些元素
        ignoreElements: (element) => {
          if (element.id === 'share_outer') return true;
        },
        // 有哪些页面上隐藏了的元素,但是又想展示在截图的海报上,可以clone克隆一份使其显现出来block
        onclone(doc) {
          let e = doc.querySelector('#rqcode_box');
          let ei = doc.querySelector('#header');
          e.style.display = 'block';
          ei.style.display = 'block';
        }
      }).then((canvas) => {
        // 在这里把canvas存起来,后面可以用,这一步不是必需
        this.canvas = canvas;
        // canvas.toDataURL(type, encoderOptions);图片格式/质量
        _this.base64Img = canvas.toDataURL('image/png', 1.0);
		// console.log(_this.base64Img)
		得到一个url格式为:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAADElEQVQImWNgoBMAAABpAAFEI8ARAAAAAElFTkSuQmCC"
        let files = _this.dataURLtoFile(this.base64Img, 'shareImg');
		// 处理数据,用于阿里云分片上传
        let imgFiles = files.type.split('/')[1];
        let imgName;
        let date = new Date().getTime();
        _this.imgTypes.map((item) => {
          if (item === imgFiles) {
            imgName = files.name + date + '.' + item;
          }
        });
        // 分片上传
        client
          .multipartUpload(imgName, files)
          .then(function(res) {
            let requestUrls = res.res.requestUrls[0];
            // 将阿里云储存地址赋值给this.url
            _this.url = requestUrls.split('?')[0];
            _this.$Toast.clear();
            // 展开分享弹窗
            _this.showShare = true;
            // _this.isShowRqcode = false
            // _this.isShowShareBtn = true
          })
          .catch(() => {
            _this.$Toast.fail('缺少图片分享地址!!');
          });
      });
    },

在这里插入图片描述

// 点击分享弹窗

    onSelect(option) {
      // console.log(option);
      // this.showShare = false;
      // 下载图片
      if (option.type == '2') {
        this.$Toast.loading({
          mask: true,
          message: '请稍等...',
          duration: 0
        });
        this.saveImgLocal();
      } else {
        this.shareWechat(option.type);
      }
      this.$nextTick(() => {
        //关闭弹窗
        this.showShare = false;
        // 清除url???在哪个步骤
        this.url = '';
      });
    },
    // 保存图片到本地
    saveImgLocal() {
      const _this = this;
      // 调用原生的方法
      this.$appBridge.callHandler('saveFile', this.url, (res) => {
        _this.$Toast.clear(); // 清除loading
		处理返回数据………………
      });
    },
    // 分享到朋友/朋友圈
    shareWechat(type) {
      let _this = this;
      if (_this.url) {
        this.$toast.loading({
          mask: true,
          message: '分享中...'
        });
        commonCall('shareImage', type, _this.url, _this.shareEndFail);
      } else {
        this.$Toast.fail('缺少图片分享地址!!');
      }
    },
    shareEndFail() {
      this.$toast.clear();
    }

commonCall文件(与安卓和ios交互)

/* 调用原生方法  fn:定义的方法 arg:定义的参数 */
export const commonCall = (fn,type,byte,errFn) => {
	let u = navigator.userAgent;
	let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器
	let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
	if(isAndroid) {
			try {
					window.JsBridge[fn](type,byte)
			} catch (err) {
					 console.log(err)
					 errFn()
			}
	} else if(isiOS) {
			try {
					console.log('IOS方法调用', fn,type,byte);
					let params = type + ',' + byte
					alert(params)
					window.webkit.messageHandlers[fn].postMessage(params,params)
			} catch (err) {
					alert(err)
					console.log(err)
					errFn()
			}
	}
};

知识:
使用html2canvas实现移动端H5页面截图:步骤:
1.首先需要安装html2canvas

npm install html2canvas

2.然后在对应的vue组件的

<script>
    import html2canvas from 'html2canvas'
</script>

3.html2canvas(document.getElementById(‘main’)这里的main包含的是你需要截屏的内容的容器的id。

<div id="main">
    这里面放自己想要截图的内容区,这个容器以外的内容不会截取到。
 </div>   

4.通过事件进行触发

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
html2canvas是一个JavaScript库,用于在网页上将HTML元素转换为Canvas图像。它可以用于生成海报,将网页内容转换为图像,并以图片的形式进行保存或展示。使用html2canvas,你可以通过将DOM元素传递给html2canvas函数来生成海报。首先,你需要在项目中安装html2canvas库,你可以使用npm或yarn进行安装。在Vue项目中,你可以使用以下命令安装html2canvas:npm install html2canvas。然后,你可以将html2canvas导入到项目中,并使用其提供的功能生成海报。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [qrcodejs2+html2canvas 生成二维码和海报](https://download.csdn.net/download/qq_39161501/36761918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [html2canvas海报生成](https://blog.csdn.net/qq_37403179/article/details/116042717)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [html2canvas生成海报的各种问题](https://blog.csdn.net/qq_41913971/article/details/107353958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值