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

news2024/11/16 6:01:37

目录

前言:实现思路

步骤一、在界面使用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-item
    label="技术/安全交底"
    required
    prop="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}`].length
    lists.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_data
        this[`${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.tempFilePath
                                resolve(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.coloradmin.cn/o/1909556.html

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

相关文章

项目管理:这样制定计划,让你事半功倍

在项目管理中&#xff0c;制定计划是成功的关键&#xff0c;一个完善的计划不仅能够明确项目的方向和目标&#xff0c;还能为团队成员提供清晰的行动指南。 制定计划的四大要素——做什么、怎么做、何时做、谁来做&#xff0c;为这一过程提供了坚实的框架。而甘特图作为一种直观…

OS Copilot:新手测评体验

文章目录 前言一、OS Copilot&#xff08;阿里云操作系统智能助手&#xff09;简介二、测评体验总结OS Copilot 产品体验评测OS Copilot 产品功能反馈 前言 本文简单分享一下自己使用OS Copilot测评体验。 一、OS Copilot&#xff08;阿里云操作系统智能助手&#xff09;简介 …

普通人必看!AI绘画商业变现全攻略(附教程)

大部分的设计师除了主业以外&#xff0c;都会利用空余时间去接单做副业。 单子包括但不限于产品/品牌LOGO、电商产品图设计、海报、室内设计图等等&#xff0c;单价在几十到上千不等 引起了我的思考&#xff0c;我们普通人有没有机会&#xff0c;也能像他们一样去接单赚钱吗&a…

挖K脚本检测指南

免责声明:本文仅做分享... 目录 挖K样本-Win&Linux-危害&定性 Linux-Web 安全漏洞导致挖K事件 Windows-系统口令爆破导致挖K事件 --怎么被挖K了??? 已经取得了权限. 挖K样本-Win&Linux-危害&定性 危害&#xff1a;CPU 拉满&#xff0c;网络阻塞&…

Spring最早的源码

地址&#xff1a;Spring最早的源码

Uniapp组件使用的详细步骤

官方文档&#xff1a;uni-app官网 (dcloud.net.cn) 一般用到的组件都在这里&#xff1a; 看介绍里面的注意事项&#xff0c;有注意的地方认真查看&#xff0c;使用的时候例如&#xff0c;以下示例日历&#xff0c;把代码粘贴到你的文件里&#xff0c;然后下载组件 1&#xff…

商家转账到零钱分销返佣场景驳回处理办法

在处理商家转账到零钱分销返佣场景被驳回的问题时&#xff0c;商家需要了解驳回的原因&#xff0c;并采取相应的措施来解决这些问题。下面将详细介绍几种常见的驳回原因以及应对策略&#xff1a; 1. 多级分销模式问题 • 原因&#xff1a;如果业务模式涉及多级分销&#xff0c;…

数据安全治理:从库级权限申请到表级权限申请

背景 随着数据安全意识的提高&#xff0c;企业越来越重视数据治理和权限管理。传统数仓大多对库级别进行读写授权&#xff0c;仅对人工标记的敏感库进行表级别授权&#xff0c;但由于敏感等级是由人为标记&#xff0c;错误率较高&#xff0c;故期望将权限申请流程细化到表级申…

Datawhale AI 夏令营 机器学习挑战赛

一、赛事背景 在当今科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的深度和广度渗透到科研领域&#xff0c;特别是在化学及药物研发中展现出了巨大潜力。精准预测分子性质有助于高效筛选出具有优异性能的候选药物。以PROTACs为例&#x…

PHP调查问卷小程序系统源码

&#x1f4ca;【问卷新风尚】调查问卷系统小程序&#xff0c;让数据收集更简单&#xff01; &#x1f4f1;【指尖轻点&#xff0c;问卷即刻生成】 告别繁琐的问卷设计过程&#xff0c;调查问卷系统小程序让你在指尖轻点间&#xff0c;就能轻松创建出专业、美观的问卷。无论是…

文章SameStr(五):图5代码

“Publication Figure 5” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(caret) library(randomForest) library(vip)…

Kudu分区策略

Kudu表的分区策略主要有三种&#xff1a;范围分区&#xff08;Partition By Range&#xff09;、哈希分区&#xff08;Partition By Hash&#xff09;和高级分区&#xff08;Partition By Hash And Range&#xff09;。这些策略都要求分区字段必须包含在主键中。 范围分区&…

内网-有道词典离线翻译安装

一、外部操作 1、在外部下载有道翻译桌面版 下载地址 2、安装到指定目录 3、登录下载离线翻译包 进入设置 -》离线增强-》离线翻译数据包-》翻译包 选择汉英互译 4、找到离线包位置 C:\Users\用户\AppData\Local\Yodao &#xff0c;此处查看自己用户所在C盘位置 二、内网…

【ai】pycharm添加本地解释器

解释器右键可以重命名 系统的解释器竟然安装了4个 可以先使用python虚拟环境中的解释器 虚拟环境虽然是属于其他的项目的&#xff0c;但是看起来也可以给自己的当前项目用&#xff1a; 添加了 别的项目里虚拟环境的解释器

科研加速器FlowUs你的智能论文助手与协作伙伴|文献整理软件|论文进度跟踪|AI辅助研究|科研时间管理

FlowUs这个科研神器简直太棒了&#xff01;试了一下&#xff0c;你的论文进度一目了然&#xff0c;就像有了一个智能助手在帮你规划每一天。日历视图让你的计划和截止日期清晰可见&#xff0c;再也不用担心错过任何重要的研究里程碑。 日历视图&#xff1a;FlowUs的日历视图功能…

DBeaver安装教程(开发人员和数据库管理员通用数据库管理工具)

前言 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库。DBeaver 提供一个图形界面用来查看数据库结构、执行SQL查询和脚本&#xff0c;浏览和导出数据&a…

React+TS前台项目实战(二十七)-- 首页响应式构建之banner、搜索、统计模块布局

文章目录 前言一、 效果展示二、相关模块1. Statistic统计模块功能分析代码详细注释使用方式 2. Search搜索模块功能分析代码详细注释使用方式 3. banner模块功能分析代码详细注释使用方式 总结 前言 前面我们已经封装了这个项目基本要用到的全局组件了&#xff0c;现在就开始…

【国产开源可视化引擎Meta2d.js】图元

图元 又称画笔Pen。图形表达的基本元素&#xff0c;组成图像的基本单元。 构成 每一个图元由ID、名字、类型、属性&#xff08;数据&#xff09;组成。 ID 名为“id”的特殊属性&#xff0c;图元实例&#xff08;画布上的图元对象&#xff09;的唯一标识。拖拽到画布或创建…

【最新鸿蒙应用开发】——Router页面路由

Router路由 页面路由指的是在应用程序中实现不同页面之间的跳转&#xff0c;以及数据传递。通过 Router 模块就可以实现这个功能. 1. 创建页面 之前是创建的文件&#xff0c;使用路由的时候需要创建页面&#xff0c;步骤略有不同 方法 1&#xff1a;直接右键新建Page&#xf…

Java项目:基于SSM框架实现的健康综合咨询问诊平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的健康综合咨询问诊平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…