uniapp+uview实现手机端上传照片带水印(保姆级全过程)

目录

前言:实现思路

步骤一、在界面使用uview的u-upload组件、放置canvas标签

步骤二、在afterRead方法中获取照片url,并创建画布生成水印,再将生成水印的照片上传到服务器

1、afterRead方法

2、照片加水印的方法

3、上传照片至服务器

4、处理水印换行操作


最终实现照片加水印效果(水印内容可自定义):

前言:实现思路

我的实现思路:使用uview的u-upload组件,在上传照片时候会调用afterRead方法,可以获取上传附件的相关属性信息,拿到照片的url之后,调用uni.getImageInfo方法,在uni.getImageInfo的成功回调函数中使用uni.createCanvasContext创建画布,制作水印的文本信息,制作完成后再使用uni.canvasToTempFilePath将画布内容转成图片,再将要上传照片的路径转换成新生成的带有水印照片的url,调用接口完成上传,至此过程结束。

步骤一、在界面使用uview的u-upload组件、放置canvas标签

<u-form-itemlabel="技术/安全交底"requiredprop="JSAQJD"
><u-upload:fileList="JSAQJD"@afterRead="afterRead"@delete="deletePic"name="JSAQJD"multiple:maxCount="3"></u-upload><view style="position: absolute;top: -999999px;"><view><canvas style="width: 1000px;height: 1000px;" canvas-id="myCanvas"></canvas></view></view>
</u-form-item>

步骤二、在afterRead方法中获取照片url,并创建画布生成水印,再将生成水印的照片上传到服务器

this[`${e.name}`]其实就是对应的fileList,这里由于上传附件的位置很多,所以最好设置成动态的

1、afterRead方法

async afterRead(e){// file name index//生成水印let data = await this.getWatermark(e.index,e.file[0].url);e.file[0].url = data;let lists = [].concat(e.file)let fileListLen = this[`${e.name}`].lengthlists.map((item)=>{this[`${e.name}`].push({...item,status:'uploading',message:'上传中'})})for(let i=0;i<lists.length;i++){const result_data = await this.uploadFilePromise(lists[i].url)let item = this[`${e.name}`][fileListLen]let img = THUMBNAIL + result_datathis[`${e.name}`].splice(fileListLen,1,Object.assign(item,{status:'success',message:'',url:img}))fileListLen++//附件的uuid更新 需做为空判断this.form[`${e.name}`] += `,${result_data}`}},

2、照片加水印的方法

//照片水印
getWatermark(index, list){return new Promise((resolve, reject) => {var that = this;uni.getImageInfo({src: list,success: (ress) => {let ctx = uni.createCanvasContext('myCanvas'); //创建画布//将图片src放到cancas内,宽高为图片大小ctx.drawImage(list, 0, 0, ress.width / 3, ress.height / 3)let textToWidth = ress.width / 3 * 0.03;  //字体宽度let textToHeight = ress.height / 3; //字体高度//根据需求,自行设置lineFeed(`拍摄:${that.userinfo.HUMANNAME}`, textToWidth, textToHeight * 0.8,ress.width / 3 * 0.9,ctx)lineFeed(`时间:${getNowDate()}`, textToWidth, textToHeight * 0.85,ress.width / 3 * 0.9,ctx)lineFeed(`地址:${that.address}`, textToWidth, textToHeight * 0.9,ress.width / 3 * 0.9,ctx)ctx.draw(false,()=>{setTimeout(() => {//制作水印需要时间,这里最好设置定时uni.canvasToTempFilePath({//内容转成图片width: ress.width / 3,    // 画布宽度height: ress.height / 3,    // 画布高度canvasId: 'myCanvas',success: (res) => {list = res.tempFilePathresolve(list);}})}, 500)});}})})
},

3、上传照片至服务器

uploadFilePromise(url){let vthis = this;return new Promise((resolve,reject)=>{let a = uni.uploadFile({url:`xxxx/uploadFile.htm`,//设置为自己的后台接口filePath:url,name:'file',formData:{folderId:vthis.recid,//存储路径,用日期标识folderPath:getRq(),recId:vthis.recid,longitude:vthis.form.XZB,latitude:vthis.form.YZB,},success:(res)=>{if(res.statusCode == 200){let o = JSON.parse(res.data)resolve(o.data[0].fileId)}}})})
},

4、处理水印换行操作

export function lineFeed(a,x,y,w,context){let chr = a.split("");let temp = "";                let row = [];context.font = 'normal bold 16px Arial,sans-serif 'context.setFillStyle('#FFA500') //字体颜色for(let i = 0; i < chr.length; i++){if( context.measureText(temp).width < w ){;}else{row.push(temp);temp = "";}temp += chr[i];}row.push(temp);for(let r = 0; r < row.length; r++){context.fillText(row[r],x,y+(r+1)*20);}
}

至此,前端成功解决照片+水印的功能~~~

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

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

相关文章

zookeeper加入开机启动项

Windows的任务计划程序&#xff08;Task Scheduler&#xff09;是一个强大的工具&#xff0c;允许你安排程序在特定时间自动运行&#xff0c;包括开机时。 打开任务计划程序&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框。输入taskschd.msc并回车&#xff0c;打开…

Python编写网络嗅探器程序捕获和显示IP数据包的头部信息

Python编写网络嗅探器程序捕获和显示IP数据包的头部信息 抓取网络数据包并解析其中的IP首部信息&#xff0c;并通过GUI界面显示解析结果。程序展示了如何使用Python的socket和ctypes库来捕获和解析网络数据包,并使用Tkinter创建一个简单的GUI界面来显示捕获到的IP头部信息。这…

日志服务SLS入门指南

日志服务SLS入门指南 什么是日志服务SLSNginx日志采集部署Nginx创建Logstore接入数据 数据脱敏创建脱敏Logstore数据加工 告警设置添加告警规则查看告警 写在最后 什么是日志服务SLS 在说到日志服务SLS之前&#xff0c;首先了解一下什么是日志服务SLS&#xff1f;日志服务SLS是…

PHP项目中的前端页面随意点击卡片后会重定向到首页或登录页

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

pycharm使用micropython

一、打开设置 2、搜索micropython、安装、重启 3、第5步需要设置成你插的电脑USB口&#xff0c;一个一个试 4、 5、 6、OK

jEasyUI 合并单元格

jEasyUI 合并单元格 jEasyUI 是一个基于 jQuery 的框架,用于创建交互式的 Web 应用程序。它提供了一系列的 UI 组件,如表格(datagrid)、树(tree)、下拉列表(combobox)等,使得用户能够轻松地构建具有丰富用户界面的应用程序。在本文中,我们将重点讨论如何在 jEasyUI …

ES6 Reflect 详解(三)

Reflect 对象与Proxy 对象一样&#xff0c;也是 ES6 为了操作对象而提供的新 API。 Reflect 对象的设计目的有 4 个。 将 Object 对象的一些明显属于语言内部的方法&#xff08;比如 Object.defineProperty &#xff09;&#xff0c;放到 Reflect 对象上。现阶段&#xff0c;某…

手机数据恢复篇:优秀的 iPhone 数据恢复汇总

如果您不幸遭遇 iPhone 死机、进水或死机&#xff0c;一切还不算晚。您可以使用 iPhone 数据恢复应用恢复文件、照片、应用数据、消息等。 使用以下选项&#xff0c;您可以恢复 iPhone 上的少量内容、特定项目或所有内容。有些应用程序甚至提供修复工具来修复最初导致数据丢失…

这组杭州亚运会可视化大屏,绝对引领了时代。

本期分享杭州亚运会的可视化大屏&#xff0c;非常的震撼&#xff0c;杭州不愧为我国互联网最发达的的城市之一。 怒赞&#xff01;&#xff01;&#xff01;

暑期旅游怎么玩?开发旅游小程序让出行变简单

暑假正值旅游旺季&#xff0c;旅游小程序的出现为旅行带来了许多便利。随着移动互联网的发展&#xff0c;旅游行业也在不断寻求创新与变革。旅游小程序为游客提供了更加便捷的旅行体验&#xff0c;通过旅游小程序&#xff0c;用户可以了解旅游信息、旅游服务、在线咨询等&#…

从 Github 安装 R packages 不完全指南

前言 R语言&#xff0c;一个被广泛使用的统计计算和数据分析工具。在日常使用过程中&#xff0c;需要安装实现各种功能、来自各种渠道的工具包&#xff08;packages&#xff09;比如&#xff1a;CRNA或者Github。很多包已经发布在 CRAN 上&#xff0c;使用 install.packages(&q…

【Dison夏令营 Day 13】使用 Python 创建扫雷游戏

在本文中&#xff0c;我们将介绍如何使用 Python 语言创建自己的基于终端的扫雷程序。 关于游戏 1992年4月6日&#xff0c;扫雷和纸牌、空当接龙等小游戏搭载在Windows 3.1系统中与用户见面&#xff0c;主要目的是让用户训练使用鼠标。扫雷是一款单人游戏&#xff0c;这个游戏…

Linux系统下anaconda的安装与Pytorch环境的下载

首先&#xff0c;在命令行通过cd命令&#xff0c;进入用户文件夹 cd xxx/xxx/username进入anaconda官网https://repo.anaconda.com/archive/&#xff0c;寻找anaconda下载包资源&#xff0c;这里选择最新的anaconda下载包 Anaconda3-2024.06-1-Linux-x86_64.sh 在命令行执行安…

Python爬虫-获取懂车帝“指定车型”的销量数据

前言 本文是该专栏的第33篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍关于懂车平台的相关爬虫,如下所示: 1. Python爬虫-新能源汽车对应的“年份月份”销量榜 2. Python爬虫-懂车帝城市销量榜单 3. Python爬虫-新能源汽车销量榜 4. Pyth…

:-1: error: ninja: build stopped: subcommand failed.

错误解释&#xff1a; 这个错误通常出现在使用Ninja构建系统进行软件编译时。Ninja是一个小型的构建系统&#xff0c;它比make更快&#xff0c;因为它直接调用指定的命令来执行构建&#xff0c;而不是像make那样通过一套复杂的规则和依赖关系来进行。如果在Ninja构建过程中遇到…

气膜建筑如何在文化旅游行业中应用—轻空间

一、气膜建筑简介 气膜建筑是一种新型建筑形式&#xff0c;其主要结构由高强度膜材、空气支撑系统和固定系统组成。通过不断向膜体内部充气&#xff0c;使其形成稳定的内部压力来支撑整个建筑结构。气膜建筑因其建设速度快、成本相对较低、环保节能等优点&#xff0c;近年来在各…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点&#xff1a;安装配置Hadoop 重 点&#xff1a; 安装配置Hadoop 难 点&#xff1a;无 内 容&#xff1a; Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威…

Linux系统编程——线程控制

目录 一&#xff0c;关于线程控制 二&#xff0c;线程创建 2.1 pthread_create函数 2.2 ps命令查看线程信息 三&#xff0c;线程等待 3.1 pthread_join函数 3.2 创建多个线程 3.3 pthread_join第二个参数 四&#xff0c;线程终止 4.1 关于线程终止 4.2 pthread_exit…

【软件设计师】九、数据流图、UML图

知识点1&#xff1a;数据流图 数据路流图亦称为数据流程图&#xff0c;一种便于用户理解&#xff0c;分析系统数据流称的图形工具&#xff1b;买哦书系统的功能&#xff0c;输入&#xff0c;输出&#xff0c;数据存储等&#xff1b; 知识点2&#xff1a;数据字典 数据流&…

深度学习 - 模型剪枝技术详解

模型剪枝简介 模型剪枝&#xff08;Model Pruning&#xff09;是一种通过减少模型参数来降低模型复杂性的方法&#xff0c;从而加快推理速度并减少内存消耗&#xff0c;同时尽量不显著降低模型性能。这种技术特别适用于资源受限的设备&#xff0c;如移动设备和嵌入式系统。模型…