<template> <u-popup :show="show" mode="center" @close="close" @open="open" bgColor="rgba(0,0,0,0)" > <view class="promotion-code"> <!-- #ifdef MP --> <view class="promotion-code-info"> <canvas canvas-id="canvas" class="canvas"></canvas> </view> <!-- #endif --> <!-- #ifdef H5 --> <view class="promotion-code-info"> <canvas v-if="!posterSrc" canvas-id="canvas" class="canvas promotion-canvas"></canvas> <image class="promotion-code-info-img" mode="scaleToFill" v-else :src="posterSrc"></image> </view> <!-- #endif --> <view class="promotion-code-but" @click="saveImage()"> 保存至相册 </view> <view v-if="!posterShow" class="promotion-code-clear" @click="show=false"> <u-icon name="close-circle-fill" color="var(--gd-bgm-color)" size="28"></u-icon> </view> </view> </u-popup> </template> <script> import { nextTick } from "vue" export default { data() { return { show: false, shareShow:false, posterShow:false, posterSrc:'', posterSrcType:null, performInfo:{ posterImg: 'https://img1.baidu.com/it/u=3302184040,3713353210&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1703178000&t=3902211e35b62703882329c63cf27129',//'../../static/customPromotionCode/bgm1.png', // 剧目背景 appletQrcode: 'https://t7.baidu.com/it/u=1127963623,72784497&fm=218&app=126&size=f242,150&n=0&f=JPEG&fmt=auto?s=361C1DC71A5A34D6877C593B0300C002&sec=1703178000&t=cc1d7c4413380f1e8769bae6ac5a66af', // '../../static/customPromotionCode/bgm2.png', // 二维码 },//节目详情 // firstGet:0, } }, methods: { initData(data) { console.log(data) this.show = true this.performInfo.posterImg = data.posterImg this.performInfo.appletQrcode = data.url this.posterSrc = '' this.$nextTick(()=>{ this.getCanvasInfo() }) }, open() { // console.log('open'); }, close() { this.show = false // console.log('close'); }, getCanvasInfo(){ let that = this //.box获取class为box的元素,如果使用的id= 'box' 则使用'#box' const query = uni.createSelectorQuery(); query.select('.promotion-canvas').boundingClientRect(data => { that.getPoster(data.width,data.height) }).exec(); }, // 海报相关开始 getPoster(w,h) { console.log(w,h) this.posterShow = true; this.shareShow = false; //前端生成海报 uni.showLoading({ title: '生成海报中' }); // 前端生成海报开始 let that = this; const ctx = uni.createCanvasContext('canvas', this); // 加载海报背景图 uni.getImageInfo({ src: this.performInfo.posterImg, success: res1 => { console.log("res1===",res1) const img1 = res1.path; // 加载海报二维码 uni.getImageInfo({ src: this.performInfo.appletQrcode, success: res2 => { console.log("res2===",res2) const img2 = res2.path; // 绘制海报背景图 ctx.drawImage(img1, 0, 0, w, h); // 绘制海报二维码 ctx.drawImage(img2, w-80, h-80, 70, 70); // 绘制完成后导出图片并显示 ctx.draw(false, () => { uni.canvasToTempFilePath({ canvasId: 'canvas', success: res3 => { this.posterShow = false this.posterSrc = res3.tempFilePath; this.posterSrcType = 'local'; }, fail: err => { this.posterShow = false console.error(err); }, }, this); }); }, fail: err2 => { this.posterShow = false console.error(err2); }, }); }, fail: err1 => { this.posterShow = false console.error("err1===",err1); }, complete: () => { this.posterShow = false uni.hideLoading() } }); // 前端生成海报结束 }, saveImage() { let that = this; uni.showLoading({ title: '保存中' }); // if (this.posterSrcType == 'local') { // let params = { // tempFilePath: that.posterSrc // } // that.saveImageToPhotosAlbum(params); // return // } uni.downloadFile({ url: this.posterSrc, success(res) { if (res.statusCode === 200) { const systemInfo = uni.getSystemInfoSync(); // 调用 getSystemInfoSync() 函数获取系统信息 console.log(systemInfo); // 打印输出系统信息对象 if (systemInfo.ua.indexOf('MicroMessenger') != -1 ) { uni.showToast({ title: "微信浏览器不可下载,可长按图片保存", icon: 'none', duration: 4000 }) return } // #ifdef MP that.saveImageToPhotosAlbum(res) // #endif // #ifdef H5 var alink = document.createElement("a"); alink.href = res.tempFilePath; alink.download = "pic"; //图片名 alink.click(); uni.showToast({ title: '下载成功', icon: 'none' }); // #endif } else { uni.showToast({ title: '下载图片失败', icon: 'none' }); } }, fail(e) { console.log('下载图片失败', e); uni.hideLoading(); uni.showToast({ title: '下载图片失败', icon: 'none' }); } }); }, saveImageToPhotosAlbum(res) { let that = this; uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success() { uni.showToast({ title: '保存到相册成功', icon: 'success' }); }, fail(err) { console.log('保存图片失败', err); if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny') { uni.getSetting({ success(res) { if (!res.authSetting['scope.writePhotosAlbum']) { uni.showModal({ title: '提示', content: '您还没有授权访问相册,请前往设置页面打开权限。', confirmText: '去设置', success(res) { if (res.confirm) { uni.openSetting(); } } }); } else { uni.showToast({ title: '保存图片失败', icon: 'none' }); } } }); } else { uni.showToast({ title: '保存图片失败', icon: 'none' }); } }, complete() { uni.hideLoading(); that.posterShow = false; } }); }, } } </script> <style lang="scss" scoped> .promotion-code { display: flex; flex-direction: column; align-items: center; position: relative; .promotion-code-info { width: 650rpx; height: 1142rpx; flex-shrink: 0; box-sizing: border-box; .canvas { width: 100%; height: 100%; } .promotion-code-info-img { width: 100%; height: 100%; } } .promotion-code-but { margin-top: 40rpx; width: 422rpx; height: 80rpx; background: var(--gd-but-color); border-radius: 40rpx; display: flex; justify-content: center; align-items: center; color: #fff; font-size: 28rpx; font-family: SourceHanSansCN, SourceHanSansCN; font-weight: 500; } .promotion-code-clear { position: absolute; top: -10rpx; right: -10rpx; } } </style>