原生微信小程序wxml2canvas生成海报并包保存至本地

Wxml2Canvas是什么?
Wxml2Canvas 是一个用于微信小程序开发的工具库,主要用途是将小程序页面的内容绘制成图片,以便生成海报或保存分享图片到相册等功能。具体用途包括:

①海报生成功能:允许开发者将当前页面的特定部分或整个页面内容绘制到 Canvas 上,并导出为图片,用于生成自定义的海报。

②分享图片生成:可以将页面内容(如用户生成的图表、统计数据等)转换为图片形式,方便用户保存或分享到社交平台。

③动态数据展示:支持将动态生成的数据内容实时绘制到 Canvas 上,使得用户可以查看并导出实时更新的信息。

④自定义绘制:可以根据项目需求自定义绘制逻辑,包括绘制图形、文本、图片等元素,以满足复杂的界面设计和展示要求。

⑤用户交互的延展:通过将用户交互的内容绘制到图片上,可以实现一些特殊的需求,如生成用户定制的表单、报告等。

总之,Wxml2Canvas 提供了一种在微信小程序中动态生成图片的有效方法,极大地增强了小程序开发的可视化和用户互动性。

1.效果
在这里插入图片描述
2.下载依赖

npm install wxml2canvas --save

3.微信开发者 工具==》构建npm
在这里插入图片描述
4.需要生成海报得页面引入Wxml2Canvas (根据自己得路径来)

import Wxml2Canvas from '../../miniprogram_npm/wxml2canvas/index'

5.完整代码 index.wxml

<view style="position: relative;height: 100%;overflow: hidden;width: 100%;">
<view style="position: relative;z-index: 999;" catchlongpress="savePoster"><canvas canvas-id="canvas2" class="share__canvas"></canvas>
</view><view style="position: absolute;left: 0;top: 0;opacity: 0;"  ><view id="share__canvas2" data-index="2" class="share__canvas share__canvas2"><image data-index="2"  class="share__canvas2-image draw_canvas" data-type="image" data-url="{{hb_bg}}" src="{{hb_bg}}" ></image><image data-index="2" class="share__canvas2-image-2 draw_canvas" data-type="image" data-url="{{hb_wx2code}}" src="{{hb_wx2code}}" mode="widthFix" data-mode="scaleToFill"></image><image data-index="2" class="share__canvas2-image-3 draw_canvas" data-type="image" data-url="" src="" mode="widthFix" data-mode="scaleToFill"></image></view></view></view>

6.index.js

import Wxml2Canvas from '../../miniprogram_npm/wxml2canvas/index'Page({data: {imgUrl:"",      // 存储海报图片路径width:"",       // canvas宽度height:"",      // canvas高度hb_wx2code: "https://img1.baidu.com/it/u=221788990,2355506378&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500",  hb_bg: "https://img1.baidu.com/it/u=3918992979,2476051043&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500",  },/*** 生命周期函数--监听页面加载* 页面加载时触发,延迟500ms后调用drawMyCanvas()绘制canvas*/onLoad(options) {setTimeout(() => {this.drawMyCanvas();}, 500);},/*** 绘制canvas* 使用wx.createSelectorQuery()获取选择器查询对象,获取指定范围内的宽度和高度,并设置到data中,* 然后在延迟1.5秒后调用startDraw()开始绘制canvas*/drawMyCanvas() {wx.showLoading({mask: true});const that = this;const query = wx.createSelectorQuery().in(this);query.select('#share__canvas2').fields({size: true,scrollOffset: true}, data => {console.log("获取宽度", data);let width = data.width;let height = data.height;that.setData({width,height});setTimeout(() => {that.startDraw();}, 1500);}).exec();},/*** 开始绘制canvas* 创建Wxml2Canvas对象,设置canvas的id、宽度、高度、背景色等参数,* 调用draw()方法开始绘制canvas内容,并在绘制完成后隐藏加载框,更新海报图片路径到data中*/startDraw() {let that = this;// 创建wxml2canvas对象let drawMyImage = new Wxml2Canvas({element: 'canvas2', // canvas的idwidth: that.data.width * 2, // canvas宽度(实际像素倍增)height: that.data.height * 2, // canvas高度(实际像素倍增)obj: that,background: '#141415',// 背景色progress(percent) {console.log(percent);// 绘制进度回调(未使用)},finish(url) {console.log("完成", url);  // 绘制完成回调,输出绘制完成的图片路径wx.hideLoading();// 隐藏加载框that.setData({imgUrl: url // 将绘制完成的图片路径更新到data中});},error(res) {console.log(res); // 绘制出错回调(未使用)wx.hideLoading(); // 隐藏加载框}});let data = {list: [{type: 'wxml',class: '.share__canvas2 .draw_canvas',limit: '.share__canvas2',x: 0,y: 0}]};drawMyImage.draw(data, this); // 调用Wxml2Canvas的draw方法开始绘制},/*** 保存海报到相册* 调用wx.saveImageToPhotosAlbum()保存海报图片到相册,若保存失败则进行授权提示*/savePoster() {const that = this;wx.saveImageToPhotosAlbum({filePath: that.data.imgUrl, // 海报图片路径success: function () {wx.showToast({title: '保存成功',icon: 'none',duration: 1500});},fail(err) {if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {wx.showModal({title: '提示',content: '需要您授权保存相册',showCancel: false,success: modalSuccess => {wx.openSetting({success(settingdata) {if (settingdata.authSetting['scope.writePhotosAlbum']) {wx.saveImageToPhotosAlbum({filePath: that.data.imgUrl,success: function () {wx.showToast({title: '保存成功',icon: 'success',duration: 2000});},});} else {wx.showToast({title: '授权失败,请稍后重新获取',icon: 'none',duration: 1500});}}});}});}}});},})

7.样式代码

.share__canvas {width: 100vw;height: 100vh;font-size: 32rpx;
}.share__canvas2 {position: relative;
}
.share__canvas2-image {width: 100%;height: 100%;
}
.share__canvas2-image-2 {width: 200rpx;position: absolute;left: 100rpx;bottom: 80rpx;
}
.share__canvas2-image-3 {width: 350rpx;position: absolute;left: 190rpx;bottom: 350rpx;
}

8.注意:外层容器 .share__canvas一定要写宽高,否则里面元素使用百分比,页面生成出来的是空白

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281602.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】决策边界的基本概念以及如何在逻辑回归中找到决策边界

引言 在机器学习中&#xff0c;决策边界是分类算法用来区分不同类别数据点的线、面或超平面。这些边界通常是模型的预测规则&#xff0c;用于将特征空间中的点分配到不同的类别。决策边界可以是线性的&#xff0c;也可以是非线性的&#xff0c;取决于数据的分布和所使用的分类算…

鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇

一、概述 云数据库是一款基于对象模型的数据库&#xff0c;采用存储区、对象类型和对象三级结构。 数据模型 存储区 存储区是一个独立的数据存储区域&#xff0c;多个数据存储区之间相互独立&#xff0c;每个存储区拥有完全相同的对象类型定义 --类似于关系型数据库中的da…

ECMA6Script学习笔记(五)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要: 本文介绍了ES6中的对象创建和拷贝方法。对象创建方面&#xff0c;ES6通过class关键字支持了面向对象的语法糖&#xff0c;包括属性设置、getter和setter方法、构造器、静态方法以及私有属性的定义。同时&#xff0c;展…

专业做护眼灯的有哪些品牌?五款市面主流护眼灯专业测评

专业做护眼灯的有哪些品牌&#xff1f;市面上出现的品牌毫不夸张的说&#xff0c;真的算得上是琳琅满目&#xff0c;而且每一个品牌都在说自己的产品才是最值得的&#xff0c;这种情况下来&#xff0c;很多人一时之间根本就不知道要选择哪一款比较好。而且还有一些还会买到低劣…

vue基础知识总结(2)--- axios的使用

一.下载Vue3&#xff1a; 选择自己想要下载的项目文件夹&#xff0c;cmd回车打开命令栏&#xff0c;执行 &#xff1a; cnpm init vuelatest 然后等待一会就可以创建一个项目&#xff0c;并更改项目名&#xff1a; √ 请输入项目名称&#xff1a; ... vue-project 之后按照…

华为仓颉语言测试申请

1. 申请网址 HarmonyOS NEXT仓颉语言开发者预览版 Beta招募- 华为开发者联盟 点击立即报名登录华为账号 勾选选项 , 点击同意 按要求填写信息即可 2. 申请通过后官方会通过邮件的方式发送相关下载途径 , 根据文档进行下载即可 package Cangmain(): Int64 {println("你…

AI技术修复奥运珍贵历史影像,《永不失色的她》再现百年奥运女性光彩

Greatness of HER &#xff01; AI致敬 , 了不起的「她」。 7月25日&#xff0c;在国际奥委会和各方力量的支持下&#xff0c;阿里云以AI技术修复奥运珍贵历史影像&#xff0c;让百年奥运女性的伟大光彩被看见&#xff0c;并在巴黎推出《永不失色的她》全球首映礼。 国际奥委会…

Graph Contrastive Learning via Interventional View Generation

发表于:WWW24 推荐指数: #paper/⭐⭐ 框架与动机: 整体框架 动机: 如上四个: b.HLCL 生成随机增强视图,并分别用高通过滤器和低通过滤器过滤 c.生成同配异配视图,都用低通过滤器 d.生成同配视图异配视图,同配视图用低通过滤器,异配视图用高通过滤器 通过图d,我们可以得出:d&g…

基于Material studio拉伸-断裂过程的Perl脚本

在材料科学的研究中&#xff0c;拉伸-断裂过程一直是科学家们探索的焦点。这一过程涉及复杂的力学行为和材料内部微观结构的变化&#xff0c;对于理解材料的性能至关重要。然而&#xff0c;传统的实验方法不仅耗时耗力&#xff0c;而且难以捕捉到微观尺度上的所有细节。 为了满…

网站如何实现HTTPS访问

要实现网站通过HTTPS协议访问&#xff0c;主要依赖于为网站部署SSL/TLS证书。 SSL&#xff08;Secure Sockets Layer&#xff09;是用于在互联网上加密数据传输的安全协议。部署了SSL证书之后&#xff0c;网站就可以通过HTTPS&#xff08;超文本传输安全协议&#xff09;来提供…

C# Unity 面向对象补全计划 之 初识继承方法与多态

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承&#xff08;字段与属性&…

Java真人版猫爪老鼠活动报名平台系统

&#x1f43e;“真人版猫爪老鼠活动报名平台系统”——趣味追逐&#xff0c;等你来战&#xff01;&#x1f42d; &#x1f431;【萌宠变主角&#xff0c;现实版趣味游戏】 厌倦了电子屏幕的虚拟游戏&#xff1f;来试试“真人版猫爪老鼠活动”吧&#xff01;在这个平台上&…

PHP进阶-CentOS7部署LNMP服务架构的项目

在开发和部署Web应用时&#xff0c;LNMP&#xff08;Linux、Nginx、MySQL、PHP&#xff09;的组合是非常常见的。这篇博客将介绍如何通过一个简单的脚本&#xff0c;在CentOS 7上部署LNMP&#xff0c;并将PHP项目自动部署到服务器上。这不仅可以节省大量的时间&#xff0c;还能…

一个接口未做超时处理,引发数据库hang了

前言 在代码开发过程中&#xff0c;你是否会经常遇到以下问题&#xff1f; 数据库连接被瞬间占用&#xff0c;出现性能瓶颈 系统资源被大量占用&#xff0c;出现锁等待或性能下降 事务日志大量增长 上述这些状况的出现可能是未提交事务引发的。该类事务开启后&#xff0c;…

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今&#xff0c;随着全球化进程的不断加速&#xff0c;市场环境复杂多变&#xff0c;市场竞争日益激烈&#xff0c;财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案&#xff0c;帮助企业在盈利能力、偿…

【随机链表的复制】python刷题记录

R3-哈希表 参考k神题解 哈希表法&#xff1a; """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:def copy…

Java红娘相亲交友平台系统源码小程序

&#x1f495;遇见真爱&#xff0c;从“红娘相亲交友平台系统”开始&#xff01;&#x1f46b; &#x1f339;【精准匹配&#xff0c;缘分不再擦肩而过】 还在为茫茫人海中找不到那个TA而烦恼吗&#xff1f;“红娘相亲交友平台系统”利用先进的大数据分析技术&#xff0c;根据…

电脑怎么压缩图片?6个简单实用的压缩方法分享(无损压缩)

电脑怎么压缩图片&#xff1f;面对电脑较大的图片&#xff0c;小编是建议大家进行压缩的。文件过大容易影响电脑存储空间&#xff0c;而且还不容易上传和传输。图片压缩有很多方法可以有效解决&#xff0c;简单几步就能将图片压缩变小&#xff0c;下面是相关的介绍&#xff0c;…

web期末大作业家乡-浙江

代码下载: https://pan.quark.cn/s/2e157769c4ad

android动态权限申请并告知权限申请的使用目的

随着工信部对APP的一系列整治&#xff0c;现在要求APP在申请相机、位置等敏感权限时需要向用户同步告知权限申请的使用目的。个大应用市场在APP上线审核中也会重点检查这项要求。 从Android 6.0开始&#xff0c;对于敏感权限的获取&#xff0c;APP需要调用系统提供的动态申请权…