uniApp实战二:仿今日相机水印功能

文章目录

1.最终效果预览

2.页面实现

页面布局

复制代码
<view @click="handleTakePhotoNew">拍照</view>
			<view v-if="!snapSrc">
				<canvas canvas-id="canvas" :style="{'width':cvWidth+'px','height':cvHeight+'px'}">
				</canvas>
			</view>
			<view v-else>
				<image :style="{'width':cvWidth+'px','height':cvHeight+'px'}" mode="aspectFit" :src="snapSrc">
				</image>
			</view>

data定义

复制代码
data() {
			return {
				snapSrc: "",
				cvHeight: "",
				cvWidth: "",
				tKey: "时 间:",
				addKey: "地 点:",
			};
		},

点击事件及方法

复制代码
handleTakePhotoNew() {
				this.snapSrc = ""
				uni.chooseImage({
					count: 1,
					success: (res) => {
						const imgPath = res.tempFilePaths[0]
						this.getWaterImageNew(imgPath)
					}
				});

			},


			async getWaterImageNew(imgPath) {
				const {
					width,
					height
				} = await this.getImageSizeByUrl(imgPath);
				this.cvWidth = width
				this.cvHeight = height
				if (this.cvWidth > 350) {
					let rad = this.cvWidth / 350
					this.cvWidth = this.cvWidth / rad
					this.cvHeight = this.cvHeight / rad
				}

				const obj = {
					url: imgPath,
					title: '日常巡检',
					time: '2025-03-03 22:22',
					address: "详细地址信息XXX",
					width: this.cvWidth,
					height: this.cvHeight
				}
				this.snapSrc = await this.imageAddWatermarksNew(obj)
			},


			async imageAddWatermarksNew(obj) {
				try {
					const waterUrl = await this.imgToCanvasNew(obj);
					return waterUrl
				} catch (error) {
					console.error(error);
				}
			},

			getImageSizeByUrl(url) {
				return new Promise((resolve, reject) => {
					uni.getImageInfo({
						src: url,
						success: function(res) {
							resolve({
								width: res.width,
								height: res.height,
							});
						},
						fail: function(err) {
							reject(new Error("getImageSizeByUrl load fail"));
						}
					})
				})
			},


			imgToCanvasNew(obj) {
				return new Promise((resolve, reject) => {
					const cWidth = obj.width > 250 ? 200 : obj.width
					const cHeight = obj.width > 250 ? 100 : obj.height
					const sNum = 5
					const fbottom = obj.height - sNum * 6;
					const halfH = sNum * 4;
					const ctx = uni.createCanvasContext("canvas");
					ctx.clearRect(0, 0, obj.width, obj.height);
					ctx.drawImage(obj.url, 0, 0, obj.width, obj.height);
					const grd = ctx.createLinearGradient(0, 0, cWidth, 0);
					grd.addColorStop(0, "#4169E1");
					grd.addColorStop(1, "#87CEFA");
					ctx.fillStyle = grd;
					ctx.fillRect(sNum * 2, fbottom - halfH * 4, cWidth, halfH * 2);
					ctx.font = "italic normal bold 25px arial";
					ctx.setFillStyle("#FFFFFF");
					ctx.setTextAlign('center')
					ctx.fillText(obj.title, cWidth / 2+sNum*2, fbottom - halfH * 2 - sNum * 2);
					ctx.fillStyle = "rgba(245,245,245,0.5)";
					ctx.fillRect(sNum * 2, fbottom - halfH * 2, cWidth, halfH * 2 + sNum);
					ctx.setTextAlign('start')
					ctx.setFontSize(sNum * 3);
					ctx.setFillStyle("#000000");
					ctx.fillText(this.tKey + obj.time, sNum * 3, fbottom - halfH);
					ctx.fillText(this.addKey + obj.address, sNum * 3, fbottom);
					setTimeout(() => {
						ctx.draw(false, async () => {
							uni.canvasToTempFilePath({
									canvasId: "canvas",
									fileType: "jpg",
									success: (res) => {
										resolve(res.tempFilePath)
									},
									fail: (err) => {
										reject(err);
									},
								},
								true
							);
						});
					}, 1000)
				});
			},
相关推荐
Southern Wind14 分钟前
AIAgent——第一章:本地 Agent 与 Vue 3 流式全栈实战
前端·javascript·vue.js
两万五千个小时22 分钟前
从零给 DSH 写一个 Webhook 通知插件
javascript·人工智能·架构
可乐鸡翅yeah_22 分钟前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
vipxieliang26 分钟前
深入理解 JavaScript 数据类型与类型转换
前端·javascript
真夜30 分钟前
# Vue2 树形虚拟滚动组件实战:从原型踩坑到无缝替换 el-tree
javascript
FLJwu1 小时前
运动相机按键与连接器硬件选型实战02:USB‑C接口选型|防水失效、虚接断连、腐蚀烧口量产大坑
c语言·开发语言·经验分享·数码相机·相机·运动相机·oem 量产
vx_Biye_Design1 小时前
flask学生课程笔记共享系统29026-计算机课程设计、毕业设计
java·javascript·spring boot·后端·elasticsearch·flask·课程设计
OpsEye2 小时前
上线大模型只是第一步,用好 AI 离不开完整的成本管控
javascript·ai编程
Hilaku2 小时前
GraphQL 在国内为什么水土不服?
前端·javascript·程序员
CV工程师丁Sir2 小时前
ArkWeb 手记 08|H5 权限弹窗:相机、定位授权接管
数码相机·华为·harmonyos