当前位置: 首页 > news >正文

UniApp+Vue3微信小程序二维码生成、转图片、截图保存整页

二维码生成工具使用@uqrcode/js,版本4.0.7
官网地址:uQRCode 中文文档(不建议看可能会被误导)
本项目采用了npm引入方式,也可通过插件市场引入,使用上会略有不同


准备工作:
安装:pnpm add @uqrcode/js
引入:import UQRCode from '@uqrcode/js/uqrcode'


二维码生成及转图片逻辑:


<view class="qrcode-icon"><!-- 设置 canvas 的固定尺寸 --><canvas type="2d" id="qrcodeCanvas" canvas-id="qrcodeCanvas" style="width: 360rpx; height: 360rpx;"></canvas>
</view>// 生成二维码
const generateWXQRCode = async () => {const query = uni.createSelectorQuery();query.select('#qrcodeCanvas').fields({ node: true, size: true }, () => {}).exec(async (res) => {if (!res[0]?.node) {console.error('未找到二维码Canvas节点');return;}const canvas = res[0].node;const ctx = canvas.getContext('2d');const { width, height } = res[0];// 设置 canvas 的绘制尺寸(避免模糊)canvas.width = width;canvas.height = height;// 创建二维码实例const qrcode = new UQRCode({data: `111111`,size: Math.min(width, height),canvasContext: ctx});// 绘制二维码await qrcode.make();await qrcode.draw();// 获取base64并转为在线urlconst fileRes: any = await base64ToTempFile({ image: canvas.toDataURL() })// 转为临时urluni.downloadFile({url: fileRes.data.fileUrl,success: (res) => {pageData.qrCodePath = res.tempFilePath}});});
};

页面绘制:
 

 <!-- 隐藏的 Canvas(用于绘制截图) --><canvascanvas-id="screenshotCanvas":style="{width: `${screenWidth}px`,height: `${screenHeight}px`,position: 'fixed',left: '-9999px'}">
</canvas>const screenWidth = ref(300)
const screenHeight = ref(400)
// 保存当前页面为图片
const takeScreenshot = async () => {try {// 1. 获取系统信息const systemInfo = await uni.getSystemInfo()screenWidth.value = systemInfo.screenWidthscreenHeight.value = systemInfo.screenHeight// 2. 设置canvas尺寸(考虑设备像素比)const dpr = systemInfo.pixelRatio || 1const canvasWidth = Math.min(screenWidth.value, 750)const canvasHeight = Math.min(screenHeight.value, 1334)const rpxToPx = screenWidth.value / 750// 3. 获取canvas上下文const canvasContext = uni.createCanvasContext('screenshotCanvas')// 4. 绘制白色背景(确保有内容)canvasContext.setFillStyle('#FFFFFF')canvasContext.fillRect(0, 0, canvasWidth, canvasHeight)// 5. 绘制背景图(使用绝对路径)const bgPath = '/subPages/static/qrcode-bg.png' // 确保图片存在于此路径try {canvasContext.drawImage(bgPath, 0, 0, canvasWidth, canvasHeight)} catch (err) {console.error('背景图加载失败:', err)// 使用备用颜色canvasContext.setFillStyle('#F0F0F0')canvasContext.fillRect(0, 0, canvasWidth, canvasHeight)}// 6. 绘制文本内容const fontSizeTitle = 72 * rpxToPxconst fontSizeDesc = 32 * rpxToPxconst centerX = canvasWidth / 2// 标题canvasContext.setFontSize(fontSizeTitle)canvasContext.setFillStyle('#000000') // 改为黑色确保可见canvasContext.setTextAlign('center')const displayText = pageData.name?.length > 7? pageData.name.substring(0, 6) + '...': pageData.namecanvasContext.fillText(displayText, centerX, 260 * rpxToPx)// 副标题canvasContext.setFontSize(fontSizeDesc)canvasContext.fillText('邀请您加入车队', centerX, 320 * rpxToPx)// 绘制二维码const qrSize = 200;const qrX = (canvasWidth - qrSize) / 2;const qrY = 480 * rpxToPx;canvasContext.drawImage(pageData.qrCodePath, qrX, qrY, qrSize, qrSize);// 失效时间canvasContext.setFillStyle('#000000')canvasContext.fillText(`${pageData.selectedTime} 23:59:59后失效`,centerX,920 * rpxToPx)// 7. 执行绘制(关键修改)await new Promise<void>((resolve, reject) => {canvasContext.draw(true, () => {setTimeout(() => {// 检查Canvas内容console.log('Canvas绘制完成')resolve()}, 500) // 增加延迟确保渲染完成})})// 8. 生成临时文件const { tempFilePath } = await uni.canvasToTempFilePath({canvasId: 'screenshotCanvas',quality: 1, // 最高质量width: canvasWidth * dpr, // 考虑DPIheight: canvasHeight * dpr})// 9. 保存到相册await uni.saveImageToPhotosAlbum({filePath: tempFilePath})uni.showToast({title: '保存成功',icon: 'success'})} catch (err) {console.error('截图失败:', err)uni.showToast({title: '保存失败: ' + (err.errMsg || '未知错误'),icon: 'none',duration: 3000})}
}

相关文章:

  • 现代生活的健康密钥:养生新法则
  • 记录:uniapp 上线部署到微信小程序vendorjs包过大的问题
  • 外网如何连接内网中的mysql数据库服务器?简单网络工具方案
  • uniapp-商城-65-shop(1-品牌信息显示,将数据库信息同步到vuex的state)
  • uni-app(3):互相引用
  • uni-app学习笔记九-vue3 v-for指令
  • PP-YOLOE-SOD学习笔记1
  • Web前端开发(HTML、CSS快速入门)
  • HarmonyOS开发-自定义倒计时功能
  • 快速创建 Vue 3 项目
  • 深入解析Java泛型:从定义到实战应用
  • RTC技术
  • NBA足球赛事直播源码体育直播M35模板赛事源码
  • SQL概述和定义
  • 50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?
  • 在Linux debian12系统上使用go语言以及excelize库处理excel数据
  • 记录:express router,可以让node.js后端文件里的路由分布的更清晰
  • 【Node.js】工具链与工程化
  • VR 航天科普,沉浸式体验宇宙奥秘​
  • iOS工厂模式
  • 做旅游网站平台合作入驻/微信营销工具
  • 公司付网站会员费科目怎么做/seo关键词如何设置
  • dw代码做网站/百度seo详解
  • 网站建设需要租用什么/大连seo按天付费
  • 做网站镜像步骤/优化课程体系
  • 网站建设的看法有哪些/户外广告