uniapp 微信小程序生成水印图片

news2024/11/13 21:53:09

在这里插入图片描述

在这里插入图片描述

效果

在这里插入图片描述

源码

<template>
	<view style="overflow: hidden;">
		<camera device-position="back" flash="auto" class="camera">
			<cover-view class="text-white padding water-mark">
				<cover-view class="">{{ address }}</cover-view>
				<cover-view class="margin-top-sm">{{ date }} {{ time }}</cover-view>
			</cover-view>
			<cover-view class="camera-btn" @click="takePhoto"></cover-view>
			<cover-view class="flex justify-between align-center photos-bar" v-if="imgList.length > 0">
				<cover-view class="photos-swiper">
					<cover-view @click="ViewImage(index)" class="margin-right-xs imgBox" v-for="(item,index) in imgList"
						:key="index">
						<cover-image class="imgItem" :src="item.src" mode="aspectFill"></cover-image>
						<cover-view class="del-icon" @tap.stop="DelImg"></cover-view>
					</cover-view>
				</cover-view>
				<cover-view @click="reportBtn" class="report-btn">上报({{ imgList.length }})</cover-view>
			</cover-view>
		</camera>
		<canvas :style="{ width: w + 'px', height: h + 'px' }" canvas-id="canvas-photo"></canvas>
	</view>
</template>

<script>
	/**
	 * author        全易
	 * time          2024-08-15 10:10:00
	 * description   水印相机
	 */
	export default {
		data() {
			return {
				w: '',
				h: '',
				photoMax: 4,
				date: "⏱️2024-08-15",
				time: "10:10:00",
				address: '📍北京 · 石景山',
				imgList: []
			}
		},
		onReady() {

		},
		onShow() {
			// uni.getSystemInfo({
			// 	success: function(res) {
			// 		if (res.windowWidth > res.windowHeight) {
			// 			console.log("横屏");
			// 		} else {
			// 			console.log("竖屏");
			// 		}
			// 	}
			// })


			// uni.startAccelerometer({
			// 	interval: 'game',
			// 	success() {
			// 		console.log("启用加速针:", e);
			// 		uni.onAccelerometerChange(function(res) {
			// 			console.log("加速针数据:", res);
			// 		})
			// 	}
			// })



			// uni.startGyroscope({
			// 	success(e) {
			// 		console.log("启用陀螺仪:", e);
			// 		uni.onGyroscopeChange((res) => {
			// 			console.log("陀螺仪数据:", res);
			// 		});
			// 	}
			// })



			wx.startDeviceMotionListening({
				success: (e) => {
					console.log("监听设备方向:", e);
					wx.onDeviceMotionChange((res) => {
						console.log("设备方向:", res)
						const alpha = res.alpha;
						const beta = res.beta;
						const gamma = res.gamma;
						console.clear()
						if (Math.abs(beta) < 10 && Math.abs(gamma) < 10) {
							console.log("正竖屏");
						} else if (Math.abs(beta) > 170 && Math.abs(gamma) < 10) {
							console.log("倒竖屏");
						} else if (Math.abs(beta) < 10 && Math.abs(gamma - 90) < 10) {
							console.log("右横屏");
						} else if (Math.abs(beta) < 10 && Math.abs(gamma + 90) < 10) {
							console.log("左横屏");
						}
					});
				}
			})
		},
		watch: {

		},
		methods: {
			// 拍照
			takePhoto() {
				if (this.imgList.length === this.photoMax) {
					return uni.showToast({
						icon: "error",
						title: `最多可拍${this.photoMax}`
					});
				}

				const that = this;
				const ccc = uni.createCameraContext();
				ccc.takePhoto({
					quality: 'high',
					success: (res) => {
						console.log("拍照:", res);
						that.createWatermark(res.tempImagePath);
					}
				});
			},
			// 生成水印
			createWatermark(image) {
				const that = this;
				uni.getImageInfo({
					src: image,
					success: res => {
						that.w = res.width / 3;
						that.h = res.height / 3.01;
						const ctx = uni.createCanvasContext('canvas-photo');
						//将图片src放到cancas内,宽高为图片大小
						ctx.drawImage(image, 0, 0, that.w, that.h);
						ctx.setFontSize(12);
						ctx.setFillStyle('#FFFFFF');
						// ctx.rotate(30 * Math.PI / 180);
						const textToWidth = that.w * 0.03;

						ctx.fillText('全易', textToWidth, that.h * 0.9);

						ctx.setFontSize(10);
						ctx.fillText(that.address, textToWidth, that.h * 0.98);
						ctx.fillText(`${that.date} ${that.time}`, textToWidth, that.h * 0.94);

						ctx.draw(false, () => {
							setTimeout(() => {
								uni.canvasToTempFilePath({
									canvasId: 'canvas-photo',
									success: ctf => {
										console.log(ctf.tempFilePath);
										this.imgList.push({
											src: ctf.tempFilePath
										})
										console.log(this.imgList);
									}
								});
							}, 1000);
						});
					}
				});
			},
			// 查看照片
			ViewImage(index) {
				uni.previewImage({
					current: index,
					urls: this.imgList.map(item => {
						return item.src
					})
				});
			},
			DelImg(e) {
				uni.showModal({
					title: '删除提醒',
					content: '确定要删除这张照片吗?',
					success: res => {
						if (res.confirm) {
							this.imgList.splice(e.currentTarget.dataset.index, 1)
							console.log(this.imgList)
						}
					}
				})
			},
			reportBtn() {
				this.imgList = [];



				uni.showToast({
					title: "处理成功"
				});
			},
		}
	}
</script>

<style scoped lang="scss">
	.camera {
		width: 100vw;
		height: 100vh;
	}

	.water-mark {}

	.camera-btn {
		width: 120rpx;
		height: 120rpx;
		line-height: 120rpx;
		border: 6rpx #FFFFFF solid;
		border-radius: 50%;
		padding: 8rpx;
		position: absolute;
		left: calc(50% - 60rpx);
		bottom: 210rpx;

		&::after {
			content: " ";
			display: block;
			width: 89%;
			height: 89%;
			position: absolute;
			top: 5%;
			left: 5%;
			border-radius: 50%;
			background-color: #FFFFFF;
		}
	}

	.photos-bar {
		width: 100%;
		height: 170rpx;
		box-sizing: border-box;
		padding: 20rpx 30rpx 40rpx;
		position: absolute;
		bottom: 0;
		left: 0;
		background-color: rgba(0, 0, 0, .8);

		.photos-swiper {
			width: 80%;
			overflow-x: auto;
			height: -webkit-fill-available;

			.imgBox {
				width: 110rpx;
				height: 110rpx;
				position: relative;
				display: inline-block;

				.del-icon {
					position: absolute;
					right: 0;
					top: 0;
					padding: 2px;
					background-color: rgba(0, 0, 0, 0.5);
				}

				.imgItem {
					width: 110rpx;
					height: 110rpx;
				}
			}
		}

		.report-btn {
			height: 68rpx;
			line-height: 68rpx;
			text-align: center;
			color: #FFFFFF;
			box-sizing: border-box;
			padding: 0rpx 20rpx;
			border-radius: 10rpx;
			background-color: #2157FF;
		}
	}

	#canvas-photo {
		position: fixed;
		top: -999999px;
	}
</style>

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

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

相关文章

基于JAVA的社团管理系统的设计与实现

TOC springboot270基于JAVA的社团管理系统的设计与实现 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供…

html+css 实现hover 边框彩色按钮

前言:哈喽,大家好,今天给大家分享html+css 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 一、效果二、原理解析1.这是一个,hover后按钮边框==变彩色==的效果。每个按钮都是1个but…

matlab关于结构体的创建

网上搜了很多结构体的创建&#xff0c;都是什么student.name student.age,或者struct. 自己摸索了一下&#xff0c;根据你想要创建结构体的格式可以划分以下两类 clear all clcdata [1, 2, 2, 1;2, 1, 1, 3;4, 3, 2, 2];data1 [0, 2, 2, 1;0, 1, 1, 3;4, 3, 0, 2;4, 3, 0, 2…

解锁企业数字化转型的终极指南:《数字时代的敏捷架构》深度解读

在当前数字化浪潮的冲击下&#xff0c;企业面临着前所未有的挑战与机遇。为了解决这一难题&#xff0c;The Open Group 和 AZone 联手推出了《数字时代的敏捷架构》&#xff0c;《数字时代的敏捷架构》汇集了全球顶尖专家的智慧和经验&#xff0c;是企业数字化转型的必读之作。…

【IEEE独立出版】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 会议时间&#xff1a;2024年11月1日-3日 会议地点&#xff1a;中国-南京…

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘、移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…

函数递归那些事

什么是递归 递归就是函数自己调用自己&#xff0c;而递归的本质其实是一种解决问题的方法。 递归的思想 递归的思想是把复杂问题大事化小的过程。即把一个大型复杂的问题不断的拆分成与原问题相似&#xff0c;但规模较小的子问题&#xff0c;直到子问题不能被拆分&#xff0…

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

MySQL9.0安装教程

软件介绍 MySQL是一个关系型数据库管理系统&#xff0c;是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件之一。 软件下载 https://pan.qu…

预报名管理系统--论文pf

TOC springboot374预报名管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

UI设计:蒸汽波风格页面有啥特征,应用哪些场景?

一、什么是蒸汽波风格 蒸汽波风格&#xff08;Steampunk&#xff09;是一种将19世纪工业时代的技术和想象力与未来科技相结合的艺术和文化流派。它通常描绘了一个类似维多利亚时代的世界&#xff0c;其中蒸汽动力是主要能源&#xff0c;机械装置和复杂的齿轮系统被广泛应用。 …

C#商城源码与.NET技术在电商领域的应用_OctShop

在当今互联网化商业的浪潮中&#xff0c;网上商城成为了企业拓展市场、提升竞争力的重要手段。而 C# 商城源码和.NET 相关的技术在构建高效、稳定、安全的网上商城中发挥着关键作用。OctShop将深入探讨 C# 商城源码、.NET 商城源码、C# 网上商城以及.NET Core 商城源码的特点、…

JavaScript基础(34)_BOM介绍、BOM对象

BOM 浏览器对象模型&#xff0c;BOM可以使我们通过JS来操作浏览器。在BOM中为我们提供了一组对象&#xff0c;用来完成对浏览器的操作。 BOM对象 Window&#xff1a;代表整个浏览器的窗口&#xff0c;同时window也是网页中的全局对象。Navigator&#xff1a;代表当前浏览器的…

VS2022实用调试技巧超详解

文章目录 1. 什么是 bug2. 什么是调试(debug)3. Debug和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5. 监视和内存观察5.1 监视5.2 内存 6. 调试举例17. 调试举例29. 编程常见错误归类9. 1 编译型错误9.2 链接型错误9. 3 运行时错误 本文章以VS2022为例讲解调试功能&am…

Linux内核分析(调度类和调度实体)

文章目录 前言一、调度类1. stop_sched_class2. dl_sched_class3. rt_sched_class4. fair_sched_class5. idle_sched_class总结 二、调度类中的操作函数三、调度实体 前言 调度是操作系统内核的一个关键职责&#xff0c;它涉及到如何合理分配CPU时间给不同的进程或线程。在Lin…

SpringBoot依赖之Spring Data Redis 一 String类型

Spring Data Redis(一) 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Re…

输入输出(I/0)流

一、 File: 是所有文件或者文件夹的路径抽象表现形式 file自动重写了toString方法&#xff0c;所以直接打印显示的是file内容 构造方法&#xff1a; public File(String pathname) public File(String parent,String child) public File(File parent,…

rust操作rabbitmq

Rust 操作 Rabbitmq 使用docker快速部署rabbitmq docker pull rabbitmq:management # 15672为rabbitmq 管理员端口&#xff0c;默认账号密码为guest(账号密码相同) docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:managementrust 添加amqp库lapin car…

影院订票系统/电影院售票系统/电影院购票系统的设计与实现/影院管理系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多电影院日常业务仍是通过人工管理的方式进行&#xff0c;需要在影院订票投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&…

【Godot4自学手册】第四十五节用着色器(shader)制作水中效果

本节内容&#xff0c;主要学习利用着色器制作水波纹效果&#xff0c;效果如下&#xff1a; 一、搭建新的场景 首先我们新建场景&#xff0c;根节点选择Node2D&#xff0c;命名为Water&#xff0c;给根节点添加两个Tilemap节点&#xff0c;一个命名为Background主要用于绘制地…