uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册

news2024/11/18 3:34:39

引言

我使用到painter的原因是,在uniapp开发微信小程序时,需要将一个页面的内容转换成图片保存到本地相册。
起初在网上找到很多都是在uniapp中使用 html2canvas 网页转换成图片再jspdf将图片转换为pdf,但是这种方式在小程序环境不支持,只在h5环境下适用,当然这个方式是可行的,可以使用webviewh5将页面嵌入到微信小程序中,可我这个整体模块已经在微信小程序实现了,时间上也不允许我重新再用h5开发,所以就使用painter方式,将微信小程序页面转换成图片。

一、painter是什么

painter是一款微信小程序插件

painter github 镜像网址:https://gitcode.net/mirrors/Kujiale-Mobile/Painter?utm_source=csdn_github_accelerator#
下图是官网自己对painter的介绍。
在这里插入图片描述

二、painter的应用场景

1.社交分享:开发者可以把用户的个人信息、活动页面等转换为图片,用户可以将这些图片保存到本地后分享到朋友圈,QQ空间等社交平台。

2.电商推广:电商平台可以把当前商品详情页转成图片,提供给用户分享到社交平台上,实现商品推广。

3.数据可视化:某些需要展现大量数据,或者复杂数据的场景,可以将数据以图表的形式展示出来,然后使用painter将这些数据图表转换为图片,提供给用户下载使用。

4.截图保存:例如问答、短篇小说、教程等类型的小程序,可一键截图保存整页内容。

5.生成个性化海报:如把用户的昵称,头像,成就等生成一张个性化的海报提供给用户保存,增强用户体验。

三、uniapp中自定义组件引用painter

uniapp中引用小程序自定义组件的方式
上面链接是官方教程如何在uniapp中引入自定义组件,我这里简单记录一下在引入微信小程序的自定义组件painter的方式。

1. 下载painter

painter下载地址
在这里插入图片描述

下载下来之后,找到compontents文件夹下的painter文件夹,这个就是我们要使用的painter组件。
在这里插入图片描述
在这里插入图片描述

2. 在项目根目录新建wxcomponents 文件夹,将下载的painter文件夹拷贝到该目录中

┌─wxcomponents                  微信小程序自定义组件存放目录
│   └──painter                   微信小程序自定义组件
│		├─painter.js
│		├─painter.wxml
│		├─painter.json
│		└─lib
├─pages
│  └─index
│		└─index.vue
│
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json

在这里插入图片描述

3. 在 pages.json 对应页面的 style -> usingComponents 引入组件:

在这里插入图片描述

// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
	"usingComponents": {
		"painter": "/wxcomponents/painter/painter"
	}
// #endif

4. 然后就可以在刚配置的页面中使用painter了

    <painter name="合同签订" :scaleRatio="2" :palette="palette" @imgOK="imgOK"
      customStyle="position:fixed;top:-9999rpx"></painter>

四、painter的基本用法

这是官网的介绍:
在这里插入图片描述
下面是我使用时用的一个简单的demo
生成的图片效果如下:
在这里插入图片描述
代码如下

  • template
<painter name="合同签订" :scaleRatio="2" :palette="palette" @imgOK="imgOK" style="position:fixed;top:-9999rpx"></painter>
<button @tap="saveImg">保存</button>
  • data
      imgSrc: '',

      painterStyle: {
        rect: {
          width: '710rpx',
          left: '20rpx',
          color: '#fff',
          borderRadius: '16rpx'
        },
        textLeft: {
          left: '40rpx',
          fontSize: '28rpx',
          color: '#111'
        },
        textRight: {
          right: '40rpx',
          fontSize: '28rpx',
          color: '#111'
        },
        textLeftTwo: {
          left: '180rpx',
          fontSize: '28rpx',
          color: '#111'
        },
        title: {
          textAlign: 'center',
          fontSize: '36rpx',
          color: '#000',
          width: '100%'
        },
        line: {
          left: '40rpx',
          width: '670rpx',
          height: '1px',
          color: '#eee'
        }
      }

  • computed
    // 这里是图片内容的具体实现
    palette() {
      const palette = {
        width: '750rpx',
        height: '1200rpx',
        background: '#f7f7f7',
        views: []
      }

      const startTop = 600 // 开始的 top 值
      const gapSize = 50 // 间隙大小

      // css 使用数组形式抽离相同样式
      const arr1 = [
        {
          type: 'rect', // 背景
          css: [{ height: '500rpx' }, this.painterStyle.rect]
        },
        {
          type: 'rect', // 分割线
          css: [{ top: '100rpx' }, this.painterStyle.line]
        },
        {
          type: 'rect', // 分割线
          css: [{ top: '200rpx' }, this.painterStyle.line]
        }
      ]

      // 文字
      const arr2 = [
        {
          type: 'text',
          text: '民用天然气供用气合同',
          css: [{ top: `${startTop}rpx`, }, this.painterStyle.title]
        },
        {
          type: 'text',
          text: '用户编号:',
          css: [{ top: `${startTop + 2 * gapSize}rpx`,}, this.painterStyle.textLeft]
        },
        {
          type: 'text',
          text: '002',
          css: [
            {
              top: `${startTop + 2 * gapSize}rpx`,
            },
            this.painterStyle.textLeftTwo
          ]
        },
        {
          type: 'text',
          text: '合同编号:',
          css: [{ top: `${startTop + 3 * gapSize}rpx`,}, this.painterStyle.textLeft]
        },
        {
          type: 'text',
          text: '123456',
          css: [
            {
              top: `${startTop + 3 * gapSize}rpx`,
            },
            this.painterStyle.textLeftTwo
          ]
        },
      ]

      palette.views = palette.views.concat(arr1, arr2)

      // 如果图片没有显示出来,可以把它放到 views 的末尾
      palette.views.push(
        {
          type: 'image',
          url: 'https://qhyxpicoss.kujiale.com/r/2017/12/04/L3D123I45VHNYULVSAEYCV3P3X6888_3200x2400.jpg@!70q',
          css: {
            top: '48rpx',
            right: '48rpx',
            width: '192rpx',
            height: '192rpx',
          },
        }
      )

      return palette
    },
  • methods
    // 图片生成成功,可以从 e.detail.path 获取生成的图片路径
   imgOK(e) {
     console.log('e', e)
     this.imgSrc = e.detail.path
     console.log('imgSrc', this.imgSrc) // 点击打印出来的内容就可以看见图片了
   },

   // 保存图片
   saveImg() {
     //用户授权并开启保存到相册的权限
     uni.authorize({
       scope: 'scope.writePhotosAlbum',
       success: (result) => {
         if (!this.imgSrc) {
           return uni.showToast({
             title: '图片生成中,请稍等~',
             icon: 'none'
           })
         }
         // 保存到手机相册
         uni.saveImageToPhotosAlbum({
           filePath: this.imgSrc,
           success: function (e) {
             console.log('保存成功', e)
             uni.showToast({
               title: '保存成功',
               icon: 'none'
             })
           }
         })
       },
       fail: (error) => {
         uni.showModal({
           title: '提示',
           content: '检测到您有未开启的权限,为保证功能正常使用,请保持保存到相册权限均为开启状态',
           confirmText: '去开启',
           success: ({ confirm }) => {
             if (confirm) uni.openSetting()
           }
         })
       }
     })
   },

这只是最基础的用法,更多需求可参考官网。

总结

好啦,以上就是如何在UniApp开发环境中使用Painter插件将微信小程序页面转换为图片并保存至本地相册。首先,我们描述了安装和配置Painter的详细步骤,包括如何在项目中引入Painter以及编写Painter绘图的JSON数据。然后,我们重点介绍了如何使用PainterCanvas上绘制出需要的图片,包括文字,图片,矩形等元素,并详细解说了如何具体控制这些元素的绘制位置,大小和样式。最后,我们介绍了怎样通过微信小程序的API,将这个绘制出来的Canvas图片保存到用户的本地相册中。希望看到这里的小伙伴,这篇记录对你有所帮助

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

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

相关文章

Redis-分布式锁!

分布式锁&#xff0c;顾名思义&#xff0c;分布式锁就是分布式场景下的锁&#xff0c;比如多台不同机器上的进程&#xff0c;去竞争同一项资源&#xff0c;就是分布式锁。 分布式锁特性 互斥性:锁的目的是获取资源的使用权&#xff0c;所以只让一个竞争者持有锁&#xff0c;这…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题&#xff0c;根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多&#xff0c;所以导…

XSS 跨站脚本攻击

XSS(DOM) XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击&#xff0c;攻击者在网页中插入由JavaScript编写的恶意代码&#xff0c;当用户浏览被嵌入恶意代码的网页时&#xff0c;恶意代码将会在用户的浏览器上执行。 XSS攻击可分为三种&#xff1a;分别为反射型(Reflected…

NLP——操作步骤讲义与实践链接

数据集与语料 语料是NLP的生命之源&#xff0c;所有NLP问题都是从语料中学到数据分布的规律语料的分类&#xff1a;单语料&#xff0c;平行语料&#xff0c;复杂结构 语料的例子&#xff1a;Penn Treebank, Daily Dialog, WMT-1x翻译数据集&#xff0c;中文闲聊数据集&#xf…

使用navicat连接postgresql报错问题解决

使用navicat连接postgresql报错问题解决 一、问题现象&#xff1a; 最近使用Navicat来连接postgreSQL数据库&#xff0c;发现连接不上&#xff0c;报错信息如下&#xff1a; 自己百度了一下&#xff0c;发现pgsql 15版本以后&#xff0c;有些系统表的列名改了&#xff0c;pg_…

【tool】快捷操作

最近在弄材料然后文件太深了&#xff0c;交流起来很不方便&#xff0c;做了记录 复制文件路径 复制文件路径步骤&#xff1a; 1、首先按住Shift 鼠标右键单击&#xff0c;弹出&#xff1a;复制为路径 2、快捷键黏贴路径&#xff0c;即可

深入理解 Flutter 图片加载原理 | 京东云技术团队

前言 随着Flutter稳定版本逐步迭代更新&#xff0c;京东APP内部的Flutter业务也日益增多&#xff0c;Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验&#xff0c;但随之也带来了一些OOM问题&#xff0c;通过线上监控信息…

VScode替换cmd powershell为git bash 终端,并设置为默认

效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe&#xff0c;复制其绝对路径&#xff0c;例如D:\Program Files\Git\bin\bash.exe把路径的右斜…

私域新零售商业模式成功的八大要素

从事互联网行业多年以来&#xff0c;遇到客户问最多的一个问题&#xff0c;就是什么样的模式火呀&#xff1f;在设计一个商业模式时&#xff0c;不单单只是考虑资金和人脉等等资源的&#xff0c;其实还是需要遵循这八大原则&#xff0c;它包括&#xff1a;客户价值最大化原则、…

vite打包配置以及性能优化

vite打包配置以及性能优化 安装插件 首先该安装的插件&#xff0c;你要安装一下吧 这三个是基本的插件&#xff0c;其他优化的插件下面会介绍到 "vite": "4.4.6","vite-plugin-html": "^3.2.0","vitejs/plugin-vue": &qu…

如何在windows电脑安装多个tomcat服务器和乱码问题

前提条件安装jdk 以17版本为例&#xff0c;将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…

2023年38页智慧水利整体解决方案PPT

导读&#xff1a;原文《2023年38页智慧水利整体解决方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 业务场景与痛点分析 业务架构图 总体目标 按照“建管并…

7-9 大笨钟

分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&#xff0c;所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的&#xff0c;如果正好在某…

矢量绘图UI设计软件Sketch mac中文版软件说明

Sketch mac是一款适用于 UI/UX 设计、网页设计、图标制作等领域的矢量绘图软件。 Sketch mac软件特点 1. 简单易用的界面设计&#xff1a;Sketch 的用户界面简洁明了&#xff0c;使得用户可以轻松上手操作&#xff0c;不需要复杂的学习过程。 2. 强大的矢量绘图功能&#xff1a…

什么是网络地址转换 (NAT)

网络地址转换&#xff08;NAT&#xff09;是更改源和目标 IP 地址和端口的过程&#xff0c;地址转换减少了对 IPv4 公共地址的需求&#xff0c;并隐藏了专用网络地址范围&#xff0c;该过程通常由路由器或防火墙完成。 NAT是如何工作的 NAT 允许单个设备&#xff08;如路由器…

计算机视觉掩模区域与二值图像

掩模区域 在图像处理中&#xff0c;我们经常需要对图像中的某些特定区域进行操作&#xff0c;例如对某个区域进行滤波、变换、裁剪或者其他处理。为了实现这些操作&#xff0c;我们需要明确指定这些区域&#xff0c;这就是掩模区域的作用。 掩模区域通常由一个二值图像表示&…

Centos 防火墙命令

查看防火墙状态 systemctl status firewalld.service 或者 firewall-cmd --state 开启防火墙 单次开启防火墙 systemctl start firewalld.service 开机自启动防火墙 systemctl enable firewalld.service 重启防火墙 systemctl restart firewalld.service 防火墙设置开…

配置使用Gitee账号认证登录Grafana

三方社会化身份源 集成gitee第三方登录 第三方登录的原理 所谓第三方登录&#xff0c;实质就是 OAuth 授权。用户想要登录 A 网站&#xff0c;A 网站让用户提供第三方网站的数据&#xff0c;证明自己的身份。获取第三方网站的身份数据&#xff0c;就需要 OAuth 授权。 举例来…

【Datawhale 科大讯飞-基于论文摘要的文本分类与关键词抽取挑战赛】机器学习方法baseline

内容 科大讯飞AI开发者大赛NLP赛道题目&#xff1a; 基于论文摘要的文本分类与关键词抽取挑战赛 任务&#xff1a; 1.机器通过对论文摘要等信息的理解&#xff0c;判断该论文是否属于医学领域的文献。 2.提取出该论文关键词。 数据集的获取 训练集&#xff1a; 这里读取tit…