uniapp实现上传图片添加日期和地点水印,修复多张图片同时上传,显示相同图片问题

news/2024/10/17 18:18:25/

整体实现流程:首先调用uni.chooseImage方法,配置count、sizeType、sourceType参数,分别代表选择的图片个数、original 原图,compressed 压缩图,默认二者都有、是从相册还是拍照。

然后在成功的回调中拿到上传的所有图片并存储。然后就是添加水印,调用uni-getImageInfo拿图片信息,然后使用canvas进行水印添加。在成功的回调中进行图片上传(uni-uploadFile)即回显。代码如下:

imgCount就是限制上传个数,当我们同时使用拍照和相册上传,会出现当上传一张拍照图片,再从相册上传这个如果不做imgCount--操作上传的个数会出现问题。也有其他实现形式哦。

如果我们在成功的回调中拿到所有图片,直接在success中循环调用添加水印方法。例如选择了两张图片就会出现上传的两张图片一摸一样。所以我没有在success中直接遍历。 

/**选择图片*/selectPicture() {uni.chooseImage({count: this.imgCount,sizeType: ['compressed'], // 压缩图片sourceType: ['camera', 'album'], // 拍照或相册上传图片success: (res: any) => {this.imgCount-- // 这里主要为了限制选择的图片,解决图片先拍照上传,后有进行相册选择// 每次清空数组this.photoArr.length = 0// 存储上传的图片this.photoArr.push(...res.tempFiles.map((item: any) => item.path)) // 添加水印this.callAddWaterMart()}})}

 这个callback方法就是为了在上传并添加水印后在给第二张图片添加。代码中也有注释,我就不多说了 

 // 调用添加水印的函数callAddWaterMart() {// 这个是真正的添加水印方法,传入回调是为了解决同时上传多张,会显示相同的图片。this.getInfoImage(() => {if (this.photoIndex < this.photoArr.length - 1) {this.photoIndex++this.callAddWaterMart()}})}// 这里为了方便写到一个函数里
getInfoImage(callback: any) {// 小程序没有document,只能在页面中建一个canvas,然后在成功时给他隐藏。this.flag = false// 这个函数是可以拿到图片的一些信息,宽高等uni.getImageInfo({// 初始化photoIndex=0,拿到第一张图片,并添加水印src: this.photoArr[this.photoIndex],success: res => {// // 设置画布高度和宽度this.canvasWidth = `${res.width}px`this.canvasHeight = `${res.height}px`//获取当前时间let roleNameInfo = date(new Date(), 'long') + '\n' + this.from.data.addressvar ctx = uni.createCanvasContext('imgId')ctx.drawImage(this.photoArr[this.photoIndex], 0, 0, res.width, res.height)// 为图片添加水印ctx.setFontSize(30) //水印字体大小ctx.setFillStyle('red') //水印颜色// 水印位置ctx.fillText(roleNameInfo, 60, res.height - 60)// 开始绘制添加水印的图片并显示在页面中ctx.draw(false, result => {setTimeout(() => {//把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。在自定义组件下,第二个参数传入自定义组件实例,以操作组件内 <canvas> 组件。// 这里主要为了拿到路径uni.canvasToTempFilePath({canvasId: 'imgId',// 设置输出的图片的宽度高度,会加快输出图片时间destWidth: res.width,destHeight: res.height,fileType: 'jpg', //jpg为了压缩quality: 0.8, //图片的质量success: res => {console.log('res', res)this.flag = true/** 添加上传进度和图片路径 */this.currentImgList.push({path: res.tempFilePath,uploadPercent: 0})// 上传图片this.uploadfile(res.tempFilePath)// 给所有的图片添加水印callback()},fail: err => {uni.hideLoading()// this.$u.toast('上传错误')}})}, 500)})},fail: err => {console.log(err)}})}

uploadFile我就不说了,每个公司都不一样的路径,看文档就可以了。这里只提示思路,代码大家自行实现。


http://www.ppmy.cn/news/701431.html

相关文章

学校计算机编程用的什么软件,电脑编程软件都有哪些

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 电脑编程软件主要有&#xff1a;BASIC、PASCAL、C、COBOL、FORTRAN、LOGO以及VC、VB java等。具体来说&#xff1a; 1、C\C 常用软件是MS VC(6.0和更高版本)集成在微软的开发工具vi…

windows系统查看电脑里面所有应用软件方法步骤

描述&#xff1a;windows系统查看电脑里面所有应用软件方法步骤 步骤&#xff1a; 桌面右键&#xff0c;新建快捷方式 %windir%\explorer.exe shell:::{4234d49b-0245-4df3-b780-3893943456e1}随便命名打开即可看到所有应用

计算机在线应用不能安装,教您电脑为什么安装不了软件

软件是计算机数据和指令的集合&#xff0c;一般有系统软件和应用软件。系统是应用软件安装的平台&#xff0c;但是由于一些设置或者故障就会出现安装不了软件的情况。接下来&#xff0c;我们就来了解一下电脑安装不了软件的解决方法 电脑是是一种根据指令进行数据处理的电子设备…

win10自带计算机应用恢复,win10重置电脑后怎么恢复应用_win10重置后恢复软件的方法...

在使用win10操作系统的过程中&#xff0c;我们经常需要通过重置系统来解决一些问题&#xff0c;可是win10重置电脑后怎么恢复应用呢&#xff1f;有许多小伙伴不是很清楚该如何操作&#xff0c;所以对于这一情况&#xff0c;今天系统城小编为大家整理分享的就是win10重置后恢复软…

苹果计算机如何安装应用软件,Mac下如何安装软件?

Mac下如何安装软件&#xff1f;对于第一次用苹果电脑的用户来说&#xff0c;安装应用程序可能会有些困难&#xff0c;因为这和Windows系统下安装程序有一定的区别。现在PC6小编以最常用的qq软件为例&#xff0c;演示如何安装qq for Mac。 1、我们先打开浏览器&#xff0c;搜索我…

从0到1精通自动化测试,pytest自动化测试框架,allure描述用例详细讲解(二十二)

一、前言 pytestallure是最完美的结合了&#xff0c;关于allure的使用&#xff0c;本篇做一个总结。 allure报告可以很多详细的信息描述测试用例&#xff0c;包括epic、feature、story、title、issue、testcase、severity等 环境准备&#xff1a; 1.python 3.6 2.pytest 4.5.…

自用推荐 !这7个电脑软件,好用到爆

分享7个电脑上好用到爆的效率软件&#xff0c;各个都是免费小体积&#xff0c;全都是自用推荐&#xff0c;能让你翻倍的提升办公效率&#xff0c;只要用过个个都不舍得删除&#xff01; 1、Total Commander-批量修改文件名 一个非常强大的文件管理器&#xff0c;支持批量修改各…

力扣算法刷题Day52|动态规划:最长递增子序列 最长连续递增序列 最长重复子数组

力扣题目&#xff1a;#300.最长递增子序列 刷题时长&#xff1a;参考题解后5min 解题方法&#xff1a;动态规划 复杂度分析 时间复杂度: O(n^2)空间复杂度: O(n) 问题总结 难点在于如何定义dp[i]&#xff0c;由哪些状态可以推出来&#xff0c;并取最大值 本题收获 动规…