小程序生成分享海报图片并保存相册

2023-10-27

前言

最近开发的小程序都有分享需求,功能大体为点击分享按钮,或主动生成海报后,用户操作保存对应海报为图片实现分享。以下是具体实现。

最终生成效果如图:
在这里插入图片描述

一、普通二维码生成

此处主要是生成工具库来生成普通二维码,如果要生成小程序码,只能通过后台接口调用开放API实现,且需要小程序已上线发布才能通过微信扫一扫进入小程序(废话不多说了。。。。)

  • 工具库:weapp.qrcode.min.js

template

<template>
	<view class="page">
		<canvas
          id="canvas"
          style="width: 160rpx; height: 160rpx"
          canvas-id="canvas"
        ></canvas>
	</view>
</template>

script

// 调用很简单
const drawQrcode = require("@/lib/weapp.qrcode.min.js)
export default {
	data(){return {}};
	onLoad(){
		this.drawCode();
	}
	methods:{
		drawCode(){
			drawQrcode({
				text: `二维码内容`,
				canvasId: "canvas",
				width: 80,
				height: 80
			})
			console.log("二维码生成")
		}
	}
}

二、生成海报图片并保存

生成海报分为两步
一是海报预览弹窗(这个是小程序内页弹窗所以直接代码编写就好)
二是通过painter将元素生成为图片保存到本地。以下代码只描述重点部分,全部代码请查看源码文件。
这里用到了painter这个组件库,这是一个通过配置json就直接生成图片的工具库,开源地址

1、引入依赖组件

这里引用了painter组件来生成(懒人不想造轮子- _ -)。因为是微信原生编写,所以放在根目录下的wxcomponents中

目录如下:

|__ wxcomponents
	|__ painter
		|__ painter.wxml
		|__ painter.wxss
		|__painter.json
		|__painter.js
		|__ ...

page.json中引入微信组件

{
	"globalStyle":{
		"usingComponents": {
			"painter": "/wxcomponents/painter/painter"
		 }
	}
}

2、生成海报图片

这里新建了两个文件,一个share.vue用于在小程序中直接展示海报的样式,一个share.js是配置painter海报的数据源

  • share.vue
<template>
  <view class="share" v-if="visible">
    <view class="share-content">
      <view class="share-chart-wrap">
        <image
          class="share-chart"
          @longpress="saveImgNow"
          src="http://qiniu.kingdou.fun/kingdou1.jpeg"
          mode="widthFix"
        />
        <view class="share-title">这是每报标题</view>
      </view>
      <view class="share-card">
        <view class="content-block">
          <view class="content-row">
            <view class="content-label">海报时间</view>
            <view class="content-value">{{ data.time }}</view>
          </view>
          <view class="content-row">
            <view class="content-label">描述</view>
            <view class="content-value">{{ data.introduce }}</view>
          </view>
          <view class="content-row">
            <view class="content-label">比赛说明</view>
            <view class="content-value">限定时间内根据动作次数记分</view>
          </view>
        </view>
        <view class="qr-block">
          <view class="qr-tips">
            <view class="tips-title">长按图片进行保存或者转发</view>
            <view class="tips-content"
              >扫描二维码即可参赛~<br />快去分享吧~
            </view>
          </view>
          <slot name="qrcode" @longpress="init"></slot>
        </view>
      </view>
    </view>
    <uni-icons
      class="close-btn"
      size="50"
      type="close"
      color="#fff"
      @click="close"
    />
    <painter
      v-show="isSave"
      style="position: absolute; top: 79rpx; left: 60rpx"
      :palette="template"
      @imgOK="onImgOK"
      @imgErr="onImgErr"
    />
  </view>
</template>

<script>
	import Card from "./share";

	export default {
		props: {
			visible: {
				type: Boolean,
				default: false,
			},
			data: {
				type: Object,
				default: () => {
					return {
						time: "",
						introduce: "",
					};
				},
			},
		},
		data() {
			return {
				imagePath: "",
				template: "",
			};
		},
		methods: {
			saveImgNow() {
				let data = { ...this.data};
				this.template = new Card().palette(data);
			},
			saveImage() {
				if (this.imagePath && typeof this.imagePath === "string") {
					// 图片保存到本地
					wx.saveImageToPhotosAlbum({
						filePath: this.imagePath,
					});
					// 关闭分享弹窗
					setTimeout(() => {
						this.$emit("update:visible", false)
					}, 500)
				}
			},
			close() {
				this.$emit("close");
			},
			onImgOK(e) {
				this.imagePath = e.detail.path;
				this.saveImage(this.imagePath);
			},
			onImgErr() {
				console.log("保存图片失败");
			},
		},
	};
</script>
<style lang="scss" scoped>
样式内容省略,详见源码。。。
</style>
  • share.js (内容太多,这里就只截部分作为参考,全部内容请参考文末的源码包)PS:这个文件通过工具生成并不需要自己编写
export default class LastMayday {
    palette(data) { // 传入动态数据源  
      return {
        width: "320px",
        height: "430px",
        background: "#f1f1f1",
        views: [
          {
            type: "text",
            text: "海报时间",
            css: {
              color: "#373737",
              background: "rgba(0,0,0,0)",
              width: "60px",
              height: "15.819999999999999px",
              top: "202px",
              left: "40px",
              // 。。。。省略
            },
          },
            {
            type: "text",
            text: data.time, //这里是动态数据
            css: {
              color: "#0061D4",
              background: "rgba(0,0,0,0)",
              width: "181px",
              height: "15.819999999999999px",
              top: "202px",
           		// 。。。。省略
            },
          },
          // 。。。。。
          }

2.1 配置painter海报json

这里即是对上面的share.js来历进行说明。要生成图片,得有生成图片的规则,也就是painter的绘制数据源。这里也是通过第三方网站来可视化生成的,通过在这个网站中先绘制好海报的样式后,再一键生成json文件,最后放进代码中。

2.2 引入数据构造函数并在适当时间触发生成海报

  • 在本文示例中是通过长按图片来触发,当然也可以是用户直接点击按钮来触发
import Card from './share.js'
export default {
	// 。。。。省略。。。
	methods: {
	// 这里假设用户长按图片,触发此方法。即上面share.vue中, @longpress="saveImgNow"
	saveImgNow() {
		let data = { ...this.data};
		this.template = new Card().palette(data);
	},
	// 生成图片事件监听(在调用new Card()后会自动触发
	// 图片生成成功时
	onImgOK(e) {
		this.imagePath = e.detail.path;
		this.saveImage(this.imagePath);
	},
	// 图片生成失败时
	onImgErr() {
		console.log("保存图片失败");
	},
}

2.3 弹窗组件中直接使用painter组件

 <painter style="position: absolute; top: -799999rpx; left: -999960rpx" :palette="template" @imgOK="onImgOK"
			@imgErr="onImgErr" />
  • 这里style中的内容是为了在视觉上隐藏海报(本质上是通过canvas再生成海报,所以需要此元素显示后再在canvas上绘制为图片)

三、源码

地址参见:https://gitee.com/sophie-code-box/share-poster

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

小程序生成分享海报图片并保存相册 的相关文章

随机推荐

  • jupyter修改默认工作路径

    修改Anaconda自动安装的jupyter notebook的默认工作路径 Anaconda默认安装的jupyter的工作路径是C Users 用户名 想要修改其默认的工作路径具体步骤如下 首先打开 Anaconda Prompt 在 A
  • 【react】react18的学习(十二)– 底层原理(二)之 迭代器 iterator

    迭代器iterator 是一种 ES6 规范 具有这种机制的数据结构才可以使用for of循环 返回每一项的值 原型链具有Symbol iterator属性的数据结构都具备 如数组 部分类数组 字符串等 普通对象就不能用 for of循环原
  • 【Echarts】配置项归纳

    Echarts 配置项归纳 一 title 二 legend 三 grid 四 xAxis yAxis 五 polar 六 radiusAxis 七 angleAxis 八 radar 九 dataZoom 1 内置型数据区域缩放组件 2
  • linux opencv人脸检测,OpenCV实现人脸检测例程

    前段时间看的OpenCV 其实有很多的例子程序 参考代码值得我们学习 对图像特征提取三大法宝 HOG特征 LBP特征 Haar特征有一定了解后 对本文中的例子程序刚开始没有调通 今晚上调通了 试了试效果还可以 还需要深入理解 值得大家动手试
  • Apache Commons DbUtils 快速上手

    Apache Commons DbUtils 快速上手 Hibernate太复杂 iBatis不好用 JDBC代码太垃圾 DBUtils在简单与优美之间取得了完美平衡 一 概述 DbUtils小巧的Java数据库操作工具 它在JDBC的基础
  • Keepalived结合Nginx实现WEB高可用服务

    前言 随着Nginx在国内的发展潮流 越来越多的互联网公司都在使用Nginx Nginx高性能 稳定性成为IT人士青睐的HTTP和反向代理服务器 Nginx负载均衡一般位于整个网站架构的最前端或者中间层 如果为最前端时单台Nginx会存在单
  • Lion:优化算法的符号发现

    文章目录 摘要 1 简介 2 算法的符号发现 2 1 程序搜索空间 2 2 高效搜索技术 2 3 泛化 方案选择与简化 3 Lion的推导与分析 3 1 求导 3 2 分析 4 Lion评估 4 1 图像分类 4 2 视觉 语言对比学习 4
  • 数据采集清洗

    文档名称 使用说明 程序名称 数据采集清洗分词V1 0 1简介 1 1数据采集程序 数据采集程序基于Python Urllib request模块编写 Urllib request是 HTTP 请求模块 可以模拟发送请求 支持自动确定响应内
  • 通讯录的实现(C语言版)

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 清空所有联系人 以名字排序所有联
  • RabbitMQ-版本号查看

    查看RabbitMQ的版本号 Eddie Wang 有时需要在服务器上查看rabbitmq当前安装的版本号 通过rabbitmqctl status就可以获得 命令如下 sudo rabbitmqctl status grep rabbit
  • Excel表格不能筛选是怎么回事?

    使用Excel时发现表格突然不能筛选了 没办法正常使用 这是怎么回事呢 纯净之家 win7纯净版系统 win7 ghost 纯净版 Excel表格不能筛选是什么原因 1 工作表被保护了 如果工作表被保护而且限制了筛选 就无法筛选了 解决办法
  • 陀螺产业区块链第七季

    2020年4月 国家发改委在例行新闻发布会上宣布区块链被正式列为新型基础设施中的信息基础设施 自此区块链正式搭上新基建的 风口 可以看出 区块链 正作为数字经济革命中的重要支撑 以新一代基础设施的姿态快速发展并渗透到我国经济的各个领域 作为
  • 关联分析算法(二)——FP-growth算法与python用法

    FP growth算法思想与Apriori类似 这里使用FP tree frequent pattern tree 数据结构来存储频繁项集 在样本量多的情况下比Apriori算法更加快速高效 案例 使用mlxtend工具包 import p
  • Windows Server 2008 R2 域控服务器运行nslookup命令默认服务器显示 UnKnown

    一 问题 域控服务器DOS窗口运行nslookup命令提示如下 二 原因分析 主要原因在于域控服务器的DNS服务器没有设置反向查找区域 计算机名称是通过IP地址反向查找到域控服务器的计算机名称 三 解决办法 1 右键反向查找区域 新建区域
  • C++编程——类模板

    文章目录 1 类模板语法 2 类模板与函数模板的区别 3 类模板中成员函数创建时机 4 类模板对象做函数参数 5 类模板与继承 6 类模板成员函数类外实现 7 类模板分文件编写 8 类模板与友元 9 类模板案例 1 类模板语法 类模板的作用
  • Vue中button的颜色更改

    上一次我学到了vue引用element的按钮测试 更改按钮颜色的时候 我跟的up主只告知了一种颜色即红色 但是他是这样写的
  • leecode69X的平方根和367有效的完全平方根-题目讲解和代码

    代码讲解 69 源代码 class Solution public int mySqrt int x int left 0 right x 2 1 int m 0 while left lt right 易错点1 容易忽略这个当平方比较大的
  • 【转】VTK和ITK中的坐标系统

    当我们在处理医学图像和应用时 一个问题就是坐标系统之间的不同 在图像应用中通常有三个坐标系 分别是世界坐标系 解剖坐标系和图像坐标系 每种坐标系目的不同 呈现数据的方式也不一样 解剖坐标系由三个平面组成 从侧面看为矢状面 从正面看为冠状面
  • 都什么年代了,你居然还连不上GitHub?

    前言 众所周知 GitHub是我们程序员在上班或者学习的时候经常会逛的一个地方 手动狗头 而且如果我们想参与开源项目的话 GitHub也是一个很好的平台 可问题是 GitHub网页总是进不去 提交代码到GitHub也总是超时 简直烦死 有时
  • 小程序生成分享海报图片并保存相册

    文章目录 前言 一 普通二维码生成 二 生成海报图片并保存 1 引入依赖组件 2 生成海报图片 2 1 配置painter海报json 2 2 引入数据构造函数并在适当时间触发生成海报 2 3 弹窗组件中直接使用painter组件 三 源码