【小程序】Canvas 画布分享海报

成品效果图

  • 可以通过切换下面图片形成不同的海报背景分享图
    在这里插入图片描述
<template>
	<view>
	 	// type="2d"必须加
		<canvas type="2d" :style="{width:Artwidth+ 'px',height:Artheight + 'px', margin:'0 auto'}" canvas-id="firstCanvas"
			id="firstCanvas"> </canvas>
		<view class="bootmbtn">
			<view class="save" @click="save">
				保存海报
			</view>
			<scroll-view scroll-x="true" style="white-space: nowrap;width:100vw">
				<view class="botmbar" :class="current==1?'new':''" @click="getimg('/static/canvas/1.jpg',1)">
					<image src="/static/canvas/1.jpg" mode=""></image>
				</view>
				<view class="botmbar" :class="current==2?'new':''" @click="getimg('/static/canvas/2.jpg',2)">
					<image src="/static/canvas/2.jpg" mode=""></image>
				</view>
				<view class="botmbar" :class="current==3?'new':''" @click="getimg('/static/canvas/3.jpg',3)">
					<image src="/static/canvas/3.jpg" mode=""></image>
				</view>
				<view class="botmbar" :class="current==4?'new':''" @click="getimg('/static/canvas/4.jpg',4)">
					<image src="/static/canvas/4.jpg" mode=""></image>
				</view>
			</scroll-view>
		</view>

	</view>
</template>

<script>
	//接口获取二维码
	import {
		getCode,
	} from "@/common/api.js"
	export default {
		data() {
			return {
				dpr: 1,
				Artwidth: 0,
				Artheight: 0,
				w: 375,
				h: 500,
				shareimg: "",
				current: 1,
				ctx: "",
			};
		},
		onLoad() {
			this.openapply()
		},
		methods: {
			//立即推广
			openapply() {
				getCode().then(res => {
					if (res.code == 1) {
						this.shareimg = res.data
						this.getimg("/static/canvas/1.jpg", 1)
					}
				})
			},
			getimg(IMG, index) {
				let that = this
				that.current = index
				const query = uni.createSelectorQuery().in(this)
				query.select("#firstCanvas").fields({
					node: true,
					size: true
				}).exec(res => {
					const {
						node: canvas
					} = res[0];
					console.log(canvas, 888)
					//绘制
					const ctx = canvas.getContext('2d');
					that.ctx = canvas//这一步为了画布转图片
					that.dpr = uni.getWindowInfo().pixelRatio || 1;
					canvas.width = that.w * that.dpr
					canvas.height = that.h * that.dpr
					ctx.clearRect(0, 0, canvas.width, canvas.height)
					that.Artwidth = that.w
					that.Artheight = that.h
					ctx.fillStyle= "#ffffff"
					ctx.fillRect(0, 0,canvas.width, canvas.height);
					console.log(canvas.width, canvas.height, 400 * that.dpr)
					//获取图片实例,去绘制
					const bgimage = canvas.createImage()
					bgimage.onload = () => {
						ctx.drawImage(bgimage, 0, 0, canvas.width, 400 * that.dpr)
						that.getcode(canvas, ctx)
					}
					bgimage.src = IMG
				})
			},
			// 绘制二维码
			getcode(canvas, ctx) {
				let that = this
				const bgimage = canvas.createImage()
				bgimage.onload = () => {
					ctx.drawImage(bgimage, (that.w - 105) * that.dpr, (that.h - 90) * that.dpr, 88 * that.dpr, 88 *
						that.dpr)
					that.getlogo(canvas, ctx)
				}
				bgimage.src = that.shareimg
			},
			//绘制 logo
			getlogo(canvas, ctx) {
				let that = this
				const bgimage = canvas.createImage()
				bgimage.onload = () => {
					ctx.drawImage(bgimage, 24 * that.dpr, (that.h - 90) * that.dpr, 88 * that.dpr, 88 * that.dpr)
					that.getfont(canvas, ctx)
				}
				bgimage.src = '/static/2.png'
			},
			// 绘制文字
			getfont(canvas, ctx) {
				let that = this
				ctx.fillStyle= "#000000"
				ctx.font = '42px "微软雅黑"';
				ctx.fillText('小程序', 130 * that.dpr, (that.h - 45) * that.dpr)
				ctx.fillStyle = "red";
				ctx.scale(that.dpr, that.dpr);
			},
			//保存
			save() {
				let that = this
				setTimeout(() => {
					uni.canvasToTempFilePath({
						canvas: that.ctx, // 使用2D 需要传递的参数
						success: function(res) {
							// 在H5平台下,tempFilePath 为 base64
							console.log(res.tempFilePath)
							uni.saveImageToPhotosAlbum({
								filePath: res.tempFilePath,
								success: function(res2) {
									uni.showToast({
										title: "保存成功,请从相册选择再分享",
										icon: "none",
										duration: 5000,
									});
								},
								fail: function(err) {
									uni.hideLoading();
									// console.log(err.errMsg);
								},
							});
						},
						fail(err) {
							console.log(err)
						}
					})
				}, 1000)
			}
		}
	}
</script>

<style lang="scss">
	.bootmbtn {
		position: fixed;
		bottom: 0;
		left: 0;
		height: 380rpx;
		padding: 24rpx 0 32rpx 32rpx;
		border-top: 4rpx #d8d3cf solid;
	}

	.botmbar {
		margin-top: 12rpx;
		display: inline-block;
		width: 310rpx;
		height: 310rpx;
		margin-right: 24rpx;
		text-align: center;
		line-height: 320rpx;

		image {
			width: 300rpx;
			height: 300rpx;
		}
	}

	.new {
		border: 3px solid #000000;
		box-sizing: border-box;
	}

	.save {
		// position: fixed;
		// bottom: 240rpx;
		// right: 24rpx;
		margin: 0 auto;
		width: 248rpx;
		height: 80rpx;
		line-height: 80rpx;
		border-radius: 80rpx;
		opacity: 1;
		background: #a91e25;
		opacity: 1;
		color: #ffffff;
		font-size: 30rpx;
		font-weight: 600;
		font-family: "PingFang SC";
		text-align: center;
	}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp调查问卷评价功能

我本来用的是uniapp官方提供的组件uni-rate组件&#xff0c;但修改成我想要的样式有点麻烦&#xff0c;于是我就自己手写一个&#xff0c;比用组件简单一点&#xff1b; dom结构 <text class"formTit must">请您对本次活动进行评价</text> <view cl…

【C语言】小游戏-三字棋

大家好&#xff0c;我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑随机下棋 6.判断输赢 7.判断棋盘是否满了 四、完整代码 game.h(相关函数的声明&#xff0c;整个代码要引用的头文件以及宏…

探索未来:直播实时美颜SDK在增强现实(AR)直播中的前景

在AR直播中&#xff0c;观众可以与虚拟元素实时互动&#xff0c;为用户带来更加丰富、沉浸式的体验。那么&#xff0c;直播美颜SDK在AR中有哪些应用呢&#xff1f;下文小编将于大家一同探讨美颜SDK与AR有哪些关联。 一、AR直播与直播实时美颜SDK的结合 增强现实技术在直播中…

AtcoderABC222场

A - Four DigitsA - Four Digits 题目大意 给定一个整数N&#xff0c;其范围在0到9999之间&#xff08;包含边界&#xff09;。在将N转换为四位数的字符串后&#xff0c;输出它。如果N的位数不足四位&#xff0c;则在前面添加必要数量的零。 思路分析 可以使用输出流的格式设…

数据结构刷题训练——链表篇(三)

目录 文章目录 前言 1. 题目一&#xff1a;环形链表Ⅱ 1.1 思路 1.2 分析 1.3 题解 1.4 方法二 2. 题目二&#xff1a;复制带随机指针的链表 2.1 思路 2.2 分析 2.3 题解 总结 前言 在这个专栏博客中&#xff0c;我们将提供丰富的题目资源和解题思路&#xff0c;帮助读者逐步提…

Java多线程(2)---线程控制和线程安全的详细讲解

目录 前言 一.线程控制方法 1.1启动线程--start() 1.2线程睡眠---sleep()方法 1.3中断线程--interrupt() 方法 1.4等待线程---join() 二.线程安全 2.1数据不安全---数据共享 ⭐不安全的演示和原因 ⭐不安全的处理方法 ⭐synchronized的使用 2.2数据不安全---内存可…

数据结构刷题训练:用栈实现队列(力扣OJ)

目录 前言 1. 题目&#xff1a;用栈实现队列 2. 思路 3. 分析 3.1 定义 “ 队列 ” 3.2 创建队列 3.3 入队 3.4 队头数据 3.5 出队 3.6 判空和销毁 4.题解 总结 前言 栈和队列是数据结构中的两个重要概念&#xff0c;它们在算法和程序设计中都有着广泛的应用。本文将带你深入了…

4.时间与窗口

4.1 时间类型 在Flink中定义了3种时间类型&#xff1a; 事件时间&#xff08;Event Time&#xff09;:事件的发生事件&#xff0c;数据本身自带时间字段。处理时间&#xff08;Processing Time&#xff09;&#xff1a;计算引擎处理时的系统时间。和摄取时间&#xff08;Inge…

(el-Form)操作(不使用 ts):Element-plus 中 Form 表单组件校验规则等的使用

Ⅰ、Element-plus 提供的 Form 表单组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 Form 表单组件情况&#xff1a; 其一、Element-plus 自提供的 Form 代码情况为(示例的代码)&#xff1a; // Element-plus 自提供的代码&#xff1a; // 此时是使用了 ts 语言环…

ELK中grok插件、mutate插件、multiline插件、date插件的相关配置

目录 一、grok 正则捕获插件 自定义表达式调用 二、mutate 数据修改插件 示例&#xff1a; ●将字段old_field重命名为new_field ●添加字段 ●将字段删除 ●将filedName1字段数据类型转换成string类型&#xff0c;filedName2字段数据类型转换成float类型 ●将filedNam…

【移动机器人运动规划】04 ——轨迹生成

文章目录 前言相关代码整理: 介绍Minimum Snap OptimizationDifferential Flatness(微分平坦)Minimum-snapSmooth 1D TrajectorySmooth Multi-Segment TrajectoryOptimization-based Trajectory Generation Convex Optimization&#xff08;凸优化&#xff09;凸函数和凸集凸优…

List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

1.应用场景&#xff0c;今天生产日志监控到一组new ArrayList() 进行add 异常&#xff0c;具体日志如下&#xff1a; eptionHandler.handler(178): TXXYBUSSINESS|执行异常 java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out…

SpringBoot禁用Swagger3

Swagger3默认是启用的&#xff0c;即引入包就启用。 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> <dependency><groupId…

理解-面向对象

目录 对象&#xff1a; 举例&#xff1a; 封装: 好处: 继承: 多态&#xff1a; 类和对象之间的关系 对象&#xff1a; 把一个东西看成对象&#xff0c;我们就可以孤立的审查它的性质&#xff0c;行为&#xff0c;进而研究它和其他对象的关系。 对象是一个应用系统中用…

Spring5 AOP 默认使用 JDK

这是博主在使用dubbo实现远程过程调用的时候遇到的问题&#xff1a; 我们如果在服务提供者类上加入Transactional事务控制注解后&#xff0c;服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象&#xff0c;而默认情况下Spring是基于JDK动态代理方式创…

ssh-keygen 做好免密登录后不生效

免密说明 通常情况下&#xff0c;我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦&#xff0c;因此我们可以在两台服务器上做免密登录&#xff0c;即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时&#xff0c;…

数字图像处理 --- 相机的内参与外参(CV学习笔记)

Pinhole Camera Model&#xff08;针孔相机模型&#xff09; 针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便&#xff0c;我们可以把物理成像平面(image plane)上的图像移到实际场景(3D object)和焦点(focal p…

Spring-2-透彻理解Spring 注解方式创建Bean--IOC

今日目标 学习使用XML配置第三方Bean 掌握纯注解开发定义Bean对象 掌握纯注解开发IOC模式 1. 第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1.1 XML管理Druid连接池(第三方Bean)对象【重点】 数据库准备 -- 创建数据库 create …

Python基础小项目

今天给大家写一期特别基础的Python小项目&#xff0c;欢迎大家支持&#xff0c;并给出自己的完善修改 &#xff08;因为我写的都是很基础的&#xff0c;运行速率不是很好的 目录 1. 地铁票价题目程序源码运行截图 2. 购物车题目程序源码运行截图 3. 名片管理器题目程序源码运行…

opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsi…