使用wxml2canvas将微信小程序页面转为图片

2023-11-11

最近有个微信小程序项目,需要将页面转为图片。微信小程序提供的Api是wx.canvasToTempFilePath,这个方法是将画布指定区域的内容导出生成指定大小的图片,但是我们是将页面导出图片,所以可以使用wxml2canvas解决

1、安装wxml2canvas

npm init
npm install wxml2canvas --save --production

npm init 是npm初始化,这个时候根据编译器终端一路回车最终会生成一个package.json文件

--production 是减少安装与业务无关的包,减少项目的体积。

2、引入wxml2canvas

import Wxml2Canvas from 'wxml2canvas'

引入之后需要对微信开发者工具做出如下设置,否则引入之后会报错

 其次选择微信开发者工具--》工具---》构建npm

这个时候就不会报错了

3、使用wxml2canvas

首先在需要生成图片的wxml文件中创建canvas容器以及选择生成图片的范围

<canvas canvas-id="myCanvas" class="myCanvas"></canvas>
<view id="my-canvas" class="my_canvas>
    <view class="header my_draw_canvas">
        <image class="headerImg my_draw_canvas" src="{{order.headerImg}}" data-type="image" data-url="{{order.headerImg}}"></image>
        <text class="headerTitle my_draw_canvas" data-type="text" data-text="您的订单详情">您的订单详情</text>
    </view>
</view>

每个需要生成图片的内容,需要注明类型。

text标签对应的data-type='text',image标签对应的data-type=‘image’

data-text=‘需要展示的文本’  data-url='需要展示的图片'

其他的data-type类型可以参考https://github.com/liudongyun1215/wxml2canvas

这个链接里面包含了许多配置项,就不一一列举了,遇到问题的时候可以参考这个文档

js文件的方法

drawMyCanvas() {
        wx.showLoading()
        const that = this
        const query = wx.createSelectorQuery().in(this);
        query.select('#my-canvas').fields({ // 选择需要生成canvas的范围
            size: true,
            scrollOffset: true
        }, data => {
            let width = data.width;
            let height = data.height;
            that.setData({
                width,
                height
            })
            setTimeout(() => {
                that.startDraw()
            }, 1500);
       }).exec()
},
startDraw() {
        let that = this
        
        // 创建wxml2canvas对象
        let drawMyImage = new Wxml2Canvas({
          element: 'myCanvas', // canvas的id,
          obj: that, // 传入当前组件的this
          width: that.data.width * 2,
          height: that.data.height * 2,
          background: '#141415', // 生成图片的背景色
          progress(percent) { // 进度
            // console.log(percent);
          },
          finish(url) { // 生成的图片
            wx.hideLoading()
            that.savePoster(url)
          },
          error(res) { // 失败原因
            console.log(res);
            wx.hideLoading()
          }
        }, this);
        let data = {
            // 获取wxml数据
            list: [{
                type: 'wxml',
                class: '.my_canvas .my_draw_canvas',  // my_canvas要绘制的wxml元素根类名, my_draw_canvas单个元素的类名(所有要绘制的单个元素都要添加该类名)
                limit: '.my_canvas', // 要绘制的wxml元素根类名
                x: 0,
                y: 0
            }]
        }
        // 绘制canvas
        drawMyImage.draw(data, this);
    },
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
                            });
                        }
                      }
                    })
                  }
                })
              }
            }
          })
      },

4、注意

使用wxml保存图片的时候,如果包含在线的图片链接,需要在微信小程序后台设置白名单,将在线链接的域名放置downloadFile合法域名里,否则生成图片的时候会报错

还有就是页面上的标签需要有宽度,否则模拟器导出正常,真机导出样式就会乱

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用wxml2canvas将微信小程序页面转为图片 的相关文章

随机推荐

  • Java中常见的十八种异常!

    作为一只敬业的程序员 就是不能接受我的编程出现bug 可见我们对bug是如此的深恶痛觉 它已成为我们职业生涯中的拦路虎 所以今天小千精心为大家总结一下Java中常见的几种异常 望大家多多注意 1 java lang NullPointerE
  • Flink 1.14.2 on Yarn遇到的坑

    Flink 1 14 2 on Yarn遇到的坑 1 Flink 1 14 2的安装 1 1下载安装Flink 1 14 2 环境准备 JDK 1 8 scala 2 12 Ubuntu 18 Hadoop 3 3 0 三台主机 hadoo
  • 比较级的用法

    文章目录 1 比较级 最高级的变换规则 2 比较级 最高级在句子中的应用 1 比较级 最高级的变换规则 通常在形容词和副词后面加 er est 最高级前面要加the hard harder the hardest 词尾是不发音的单音节e时
  • 使用 Python 的支持向量回归 (SVR):预测建模的实用方法

    介绍 支持向量回归 SVR 是一种用于解决回归问题的强大算法 它是支持向量机 SVM 的一部分 用于变量之间的非线性关系 在本文中 我们将学习如何使用 python 语言实现它 了解 SVR SVR 的目标是找到最适合数据点的超平面 同时允
  • 部署gitlab以及迁移代码仓库方案

    作者 JohnLi 未经允许 禁止转载 一 关闭防火墙与内核 systemctl stop firewalld setenforce 0 二 配置yum源并下载依赖 root gitlab cd etc yum repos d root g
  • 深度选择器{/deep/ ; >>> ; ::v-deep }在vue前端项目中使用注意事项

    官网地址 https vue loader vuejs org zh guide scoped css html E6 B7 B1 E5 BA A6 E4 BD 9C E7 94 A8 E9 80 89 E6 8B A9 E5 99 A8
  • linux gvim使用教程,Vim编辑器使用教程

    Vim是一个类似Vi的著名的功能强大 高度可定制的文本编辑器 在Vi的基础上改进和增加了许多的功能 Vim是自由软件 今天我们就来讲讲Vim的使用方法 本文是基于CentOS7上的vim编辑器演示的 默认CentOS7没有安装Vim 可以使
  • 解压后还原jar包

    解压后还原jar包 记一次 jar 包还原 JAR 文件就是 Java Archive Java 档案文件 它是 Java 的一种文档格式 JAR 文件非常类似 ZIP 文件 准确的说 它就是 ZIP 文件 所以叫它文件包 JAR 文件与
  • vue-charts 的图片自定义导出

    chart 图
  • [YOLO专题-27]:YOLO V5 小目标检测遇到的问题与常见解决办法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122348281 目录 第1章 前言
  • 使用android studio进行springboot项目的开发

    B站视频 Step 1 Modify build gradle Module Dir apply plugin org springframework boot apply plugin java dependencies implemen
  • MATLAB—医学图像读取(1)

    基于matlab的医学图像处理 图像读取 1 1 一般图像读取 2 医学图像读取操作 图像读取 1 1 一般图像读取 imread指令 读取图像文件 BMP GIF PNG JPEG and TIFF imshow指令 显示图像 imwri
  • 逆向爬虫26 各种加密逻辑

    逆向爬虫26 各种加密逻辑 一 什么是加密 加密就是输入一段得懂的东西 明文 通过一系列数学算法加工后 输出一段看不懂的东西 密文 二 为什么要加密 什么情况下需要加密 当我们想在网络上传输私密数据时 就需要用到加密 加密可以使数据变得更安
  • 从事研发管理的心得

    从事管理工作的心得 前言 职业生涯中 从技术走向管理似乎已成为普遍并达成共识的职业规划套路 但要完成这样的转变过程是需要一定的思考的 它肯定不会也不应该如同开关切换一样简单 因为在技术与管理之间肯定不是断崖 即使是也应该有一个安全可靠且宽阔
  • 芯片封装测试流程详解,一文带你了解清楚

    芯片封装是指芯片在框架或基板上布局 粘贴固定和连接 经过接线端后用塑封固定 形成立体结构的工艺 下面就带大家来了解一下芯片封装 什么是芯片 想要了解芯片封装测试 首先应该了解芯片 芯片其实是半导体元件产品的统称 很多时候我们把集成电路 In
  • [jQuery自定义插件] 2 自定义消息弹窗插件-jQueryToast

    用多了市面上的各种ui框架 各种的消息弹窗类型 我选择其中的一种 我觉得比较好看的 去模仿实现了 先上源码 再解释 目录结构 1 jQueryToast css ftoast position fixed top 0 width 351px
  • [Hive]一篇带你读懂Hive是什么

    作者简介 大家好 我是Philosophy7 让我们一起共同进步吧 个人主页 Philosophy7的csdn博客 系列专栏 哲学语录 承认自己的无知 乃是开启智慧的大门 如果觉得博主的文章还不错的话 请点赞 收藏 留言 支持一下博 gt
  • 组合优化问题求解算法思路的整理(VRP、SDVRP,container loading)

    一 技术背景与合作的必要性 解决合作问题现有的技术路线 挑战与不足 拟采用的技术路线 合作引进 这种技术的有益效果 缺 求解组合优化问题可以通过利用各种数学方法 寻找离散事件的最优编排 分组 次 序或筛选等 目前常用的优化算法可以分为以下四
  • 【LaTeX 教程】04. LaTeX 插入数学公式与符号

    LaTeX 教程 04 LaTeX 插入符号与数学公式 LaTeX 公式 我将把握最近文章里用到的数学公式格式都放上来供大家参考学习 首先 最简单的数学模式 xxx 一个 符号 中间的内容是行内模式 xxx 两个 符号 中间的内容是行间模式
  • 使用wxml2canvas将微信小程序页面转为图片

    最近有个微信小程序项目 需要将页面转为图片 微信小程序提供的Api是wx canvasToTempFilePath 这个方法是将画布指定区域的内容导出生成指定大小的图片 但是我们是将页面导出图片 所以可以使用wxml2canvas解决 1