位置: IT常识 - 正文

vue - vue中实现对图片添加水印和截图的功能(vue能实现什么)

编辑:rootadmin
vue - vue中实现对图片添加水印和截图的功能 文章目录1,添加水印2,图片截图3,上传多个图片同时并添加上水印1,添加水印

推荐整理分享vue - vue中实现对图片添加水印和截图的功能(vue能实现什么),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue有哪些方法,vue功能实现,vue中的...,vue中的...,vue中key,vue实用技巧,vue功能实现,vue如何用,内容如对您有帮助,希望把文章链接给更多的朋友!

选择上传一张图片,使用cavans对其添加水印; 我这里使用的是vantUI的uploader组件上传图片,当然也可以使用原生的input type='file'来上传图片,然后拿到资源句柄;

效果图如下: 水印是在左下角

代码如下:

大家主要看afterRead(file) 方法即可,其中需要注意的是:

1,形参file是拿到的图片的base64格式和其他的一些信息; 2,添加水印主要使用this.base64AddWaterMaker()这个方法进行操作,返回的是一个promise可以使用await进行接收也可以直接在then里面拿到返回的base64图片文件; 3,canvas.getContext(‘2d’)创建了一个2d的画布,而ctx.drawImage()像是一个画笔,开始绘制图像; 4,img.onload()方法是一个异步加载的方法; 5,toDataURL()方法把图形转变成base64编码格式的png;

<template> <div> <p>用户选择一张图片进行添加水印并截图</p> <!-- <van-uploader :after-read="afterRead" />--> <van-uploader :after-read="afterRead"> <van-button icon="plus" type="primary" size="small">上传文件</van-button></van-uploader> <van-button type="primary" size="small" class="del" @click="delImg">删除图片</van-button> <van-button type="primary" size="small" class="del" @click="screenShot">图片截图</van-button> <van-button type="primary" size="small" class="del" @click="jumpTo">跳转静态路由</van-button> <div class="preview" v-if="true"> <div class="perview-box"> <img :src="imgBase64" alt="" id="img" /> </div> </div> </div></template><script>// 引入截图所需要的依赖 下载地址为:https://blog-static.cnblogs.com/files/lyt520/html2canvas.min.jsimport html2canvas from '../../plugins/html2canvas.js';export default { components: {}, data() { return { // 图片的base编码 imgBase64: '', // 水印配置项 waterMakeConfig: { font: 'microsoft yahei', //字体 //水印文本内容 textArray: ['风-温迪', '2022/9/1 10:13'], }, }; }, // 计算属性 computed: {}, // 监听属性 watch: {}, created() {}, mounted() {}, methods: { // 图片上传完成的操作 afterRead(file) { // 下面是给图片添加水印 try { this.base64AddWaterMaker(file.content, this.waterMakeConfig).then((res) => { 这里可以把添加水印后的文件传给后端,我这里只是举例并没有做 console.log("res",res); }); } catch (error) { console.log('error:', error); } }, // 给图片添加水印 base64AddWaterMaker(base64Img, waterMakeConfig) { // 保留this指向 后面会用到的 let _this = this; return new Promise((resolve, reject) => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.crossOrigin = 'Anonymous'; // 图片加载的过程中允许出现跨域 // 先有src属性才会触发 onload函数 img.src = base64Img; // 异步加载 img.onload = function () { // 注意img.onload方法是异步的 canvas.width = img.width; canvas.height = img.height; ctx.font = `40px Georgia`; // 给文字添加颜色 // ctx.fillStyle = 'red'; // 添加渐变颜色的水印 var gradient = ctx.createLinearGradient(0, 0, 200, 0); gradient.addColorStop(0, 'blue'); gradient.addColorStop(1, 'red'); ctx.fillStyle = gradient; // 以左上角为坐标原点 开始绘制图像 ctx.drawImage(img, 0, 0, img.width, img.height); ctx.fillText(waterMakeConfig.textArray[0], img.width * 0.05, img.height * 0.8); //在图片上添加字体 ctx.fillText(waterMakeConfig.textArray[1], img.width * 0.05, img.height * 0.85); let resultBase64 = canvas.toDataURL('image/png'); // 返回的图片文件也是base64格式的 if (!resultBase64) { reject(); } else { _this.imgBase64 = resultBase64; resolve(resultBase64); } }; }); }, // 删除图片 delImg() { this.imgBase64 = null; }, // 测试动态路由 点击跳转动态路由页面 并传参 jumpTo() { this.$router.push({ path: '/routers/123' }); }, // 图片截图 使用了html2canvas插件 screenShot() { if(!this.imgBase64){ return alert("请先上传一张图片!") } // 获取截取的元素 这里直接获取img const imgEl = document.getElementById('img'); html2canvas(imgEl, { scale: window.devicePixelRat, //设备像素比 backgroundColor: null, //设置截图的背景色 allowTaint: false, //允许跨域(图片跨域相关) useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题 taintTest: true, //是否在渲染前测试图片 }).then((canvas) => { // 导出图像 let url = canvas.toDataURL('image/png', 1.0); var saveLink = document.createElement('a'); // 创建a链接 saveLink.href = url; saveLink.download = 'downLoad.png'; // 下载的图片名称 saveLink.click(); }); }, },};</script><style lang="scss" src="./cavans.scss" scoped></style>2,图片截图vue - vue中实现对图片添加水印和截图的功能(vue能实现什么)

1, 图片截图功能需要引入一个插件,插件下载地址为:

https://blog-static.cnblogs.com/files/lyt520/html2canvas.min.js

2,下载完成后放到一个指定的位置 然后引入:

3, 然后在 methods里面 新增一个screenShot()方法即可完成截图功能

代码如下:

// 图片截图 使用了html2canvas插件 screenShot() { if(!this.imgBase64){ return alert("请先上传一张图片!") } // 获取截取的元素 这里直接获取img const imgEl = document.getElementById('img'); html2canvas(imgEl, { scale: window.devicePixelRat, //设备像素比 backgroundColor: null, //设置截图的背景色 allowTaint: false, //允许跨域(图片跨域相关) useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题 taintTest: true, //是否在渲染前测试图片 }).then((canvas) => { // 导出图像 let url = canvas.toDataURL('image/png', 1.0); var saveLink = document.createElement('a'); // 创建a链接 saveLink.href = url; saveLink.download = 'downLoad.png'; // 下载的图片名称 saveLink.click(); }); },3,上传多个图片同时并添加上水印

如果你的业务需求是上传多个图片,同时要求添加水印;可以预览;我们也可以使用vant的uploader组件的 v-model="fileList"属性进行操作;

实现效果如下: 实现代码如下:

注意: 一个afterReadImg()方法就可以实现了,原理主要是监听(this.$watch)fileList的长度变化,如果新增了一张或多张,那就同步的把每一张都添加水印,并添加一个新的属性 watermark: true, //水印标识;这是判断是否添加水印的标识,新增的图片肯定没有此属性,就可以添加水印了;

在循环的最后面要调用unWatch()方法解除监听,否则会引起无限监听循环;因为我们this.fileList = templateList改变了响应式属性fileList;

<template> <div> <p>请选择图片</p> <van-uploader v-model="fileList" :after-read="afterReadImg" multiple /> </div></template><script>export default { components: {}, data() { return { // 水印配置项 waterMakeConfig: { font: "microsoft yahei", //字体 //水印文本内容 textArray: ["风-温迪", "2022/9/1 10:13"], }, // 图片列表 fileList: [], }; }, methods: { // 上传多个文件 async afterReadImg(files) { // 开始启动监听 let unWatch = this.$watch( () => this.fileList, async (newValue, oldValue) => { if (newValue.length == 0) { return; } let templateList = []; //存储临时文件列表 for (let index = 0; index < newValue.length; index++) { // 说明没有添加水印 if (!newValue[index].watermark) { // 开始加水印 let base64 = await this.base64AddWaterMaker( newValue[index].content, this.waterMakeConfig ); // 把base64转为文件类型 用于后续上传到后端 let file = this.convertBase64UrlToBlob(base64); templateList.push({ file, url: base64, // 图片的base64 watermark: true, //水印标识 }); } else { // 已经添加水印的会自动排在最前面 templateList.push(newValue[index]); console.log("已经添加过水印"); } } unWatch(); // 此处一点要解除监听 否则会引起无线循环监听 this.fileList = templateList; // 重新赋值 }, { immediate: true } ); }, // 给图片添加水印 base64AddWaterMaker(base64Img, waterMakeConfig) { // 保留this指向 后面会用到的 let _this = this; return new Promise((resolve, reject) => { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); const img = new Image(); img.crossOrigin = "Anonymous"; // 图片加载的过程中允许出现跨域 // 先有src属性才会触发 onload函数 img.src = base64Img; // 异步加载 img.onload = function () { // 注意img.onload方法是异步的 canvas.width = img.width; canvas.height = img.height; ctx.font = `40px Georgia`; // 给文字添加颜色 // ctx.fillStyle = 'red'; // 添加渐变颜色的水印 var gradient = ctx.createLinearGradient(0, 0, 200, 0); gradient.addColorStop(0, "blue"); gradient.addColorStop(1, "red"); ctx.fillStyle = gradient; // 以左上角为坐标原点 开始绘制图像 ctx.drawImage(img, 0, 0, img.width, img.height); ctx.fillText( waterMakeConfig.textArray[0], img.width * 0.05, img.height * 0.8 ); //在图片上添加字体 ctx.fillText( waterMakeConfig.textArray[1], img.width * 0.05, img.height * 0.85 ); let resultBase64 = canvas.toDataURL("image/png"); // 返回的图片文件也是base64格式的 if (!resultBase64) { reject(); } else { // _this.imgBase64 = resultBase64; resolve(resultBase64); } }; }); }, /** * 将以base64的图片url数据转换为Blob 并进行上传 * @param urlData 用url方式表示的base64图片数据 */ convertBase64UrlToBlob(urlData, filename) { console.log(222); if (urlData == "" || !urlData) { return console.warn("base64的图片不存在"); } // 以base64的图片url数据转换为Blob var arr = urlData.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } let bold = new Blob([u8arr], { type: mime }); return bold; }, },};</script><style lang="scss" src="./cavans.scss" scoped></style>

css代码如下:

.container{ width: 402px; height: 300px; background:#ccc; border: 1px solid red; margin: 0 auto; }// 预览的盒子.perview-box{ width: 402px; height: 400px; border: 1px solid; margin-top: 10px; #img{ display: inline-block; width: 400px; }}.del{ margin-left: 20px;}
本文链接地址:https://www.jiuchutong.com/zhishi/292383.html 转载请保留说明!

上一篇:微信小程序自定义导航栏,实现不同用户角色登陆后显示不同的tabbar(避坑版)(微信小程序自定义函数)

下一篇:威尔士中部水仙花中的蓝山雀 (© Philip Jones/Alamy)(威尔士黄水仙)

  • oppo手机有地震提醒吗(OPPO手机有地震预警系统吗?)

    oppo手机有地震提醒吗(OPPO手机有地震预警系统吗?)

  • word怎么添加导航目录(word怎么添加导航链接)

    word怎么添加导航目录(word怎么添加导航链接)

  • 联通esim是什么意思

    联通esim是什么意思

  • 原彩显示突然没了(原彩显示没变化)

    原彩显示突然没了(原彩显示没变化)

  • 淘宝在双11期间,红包可以退吗(淘宝在双11期间有优惠吗)

    淘宝在双11期间,红包可以退吗(淘宝在双11期间有优惠吗)

  • 金立手机位置信息打不开是怎么回事(金立手机gps定位打不开怎么办)

    金立手机位置信息打不开是怎么回事(金立手机gps定位打不开怎么办)

  • windows的目录结构是什么结构(windows的目录结构采用的是)

    windows的目录结构是什么结构(windows的目录结构采用的是)

  • 华为如何恢复出厂设置(华为恢复出厂设置)

    华为如何恢复出厂设置(华为恢复出厂设置)

  • 剪映怎么把一张照片做成一个视频(剪映怎么把一张图片分割成三张)

    剪映怎么把一张照片做成一个视频(剪映怎么把一张图片分割成三张)

  • 丢失的手机登录微信以前的聊天记录还在吗(丢失的手机登录着微信怎么找)

    丢失的手机登录微信以前的聊天记录还在吗(丢失的手机登录着微信怎么找)

  • 哪个模块能观察出硬盘使用过的时间和次数(哪个模块能观察出硬盘使用过的时间)

    哪个模块能观察出硬盘使用过的时间和次数(哪个模块能观察出硬盘使用过的时间)

  • 红米note忘了锁屏密码(红米note忘了锁屏密码怎么办)

    红米note忘了锁屏密码(红米note忘了锁屏密码怎么办)

  • 怎么设置定时发朋友圈(怎么设置定时发送消息)

    怎么设置定时发朋友圈(怎么设置定时发送消息)

  • 华为nova6卡槽怎么打开(华为nova6卡槽怎么打不开)

    华为nova6卡槽怎么打开(华为nova6卡槽怎么打不开)

  • ipad7是什么时候出的(ipad7是什么时候的)

    ipad7是什么时候出的(ipad7是什么时候的)

  • 微信wap接入点怎么更换(微信wap接入点怎么打开)

    微信wap接入点怎么更换(微信wap接入点怎么打开)

  • 荣耀9lite是青春版吗(荣耀9lite青春版手机壳用什么尺寸)

    荣耀9lite是青春版吗(荣耀9lite青春版手机壳用什么尺寸)

  • 魅族16s有红外遥控吗(魅族16s红外线遥控)

    魅族16s有红外遥控吗(魅族16s红外线遥控)

  • iphonex算2k屏吗(iphone x是4k屏吗)

    iphonex算2k屏吗(iphone x是4k屏吗)

  • 正常键盘尺寸是多少(键盘尺寸是多少)

    正常键盘尺寸是多少(键盘尺寸是多少)

  • 华为p30有40瓦快充吗(华为p3040瓦快充)

    华为p30有40瓦快充吗(华为p3040瓦快充)

  • 怎么用微信号确认对方在哪里(微信怎么通过微信号找手机号)

    怎么用微信号确认对方在哪里(微信怎么通过微信号找手机号)

  • powerbeats pro 可以和安卓连接吗(powerbeatspro可以用快充吗)

    powerbeats pro 可以和安卓连接吗(powerbeatspro可以用快充吗)

  • vivox27支不支持快充(vivox27支不支持wifi6)

    vivox27支不支持快充(vivox27支不支持wifi6)

  • 如何艾特别人(微信如何艾特别人)

    如何艾特别人(微信如何艾特别人)

  • huaweiMate 20搭载的芯片(mate 20配置)

    huaweiMate 20搭载的芯片(mate 20配置)

  • 库乐队是什么可以删除吗(库乐队拿来干嘛的)

    库乐队是什么可以删除吗(库乐队拿来干嘛的)

  • 刷宝视频怎么发布视频(在刷宝发布视频有收益吗)

    刷宝视频怎么发布视频(在刷宝发布视频有收益吗)

  • AMI BIOS设置图解教程+Award Bios设置全程图解(ami bios怎么设置u盘启动)

    AMI BIOS设置图解教程+Award Bios设置全程图解(ami bios怎么设置u盘启动)

  • 关闭开机自动启动的软件教程(关闭开机自动启动)

    关闭开机自动启动的软件教程(关闭开机自动启动)

  • python round()函数是什么(Pythonround函数作用)

    python round()函数是什么(Pythonround函数作用)

  • 车船税计入管理费用什么明细
  • 文化事业建设税怎么申报
  • 增值税专用发票抵扣期限
  • 红冲以前年度的费用怎么做账
  • 信息技术服务可以简易征收吗
  • 税款必须要15号之前交吗
  • 研发人员的社保也要进入研发费用吗
  • 调研费包括哪些科目
  • 金税盘地区编号淄博
  • 股权出让需要交税吗
  • 一般公共预算支出是什么意思
  • 商贸公司购进农产品可以抵扣吗
  • 可供出售金融资产和交易性金融资产
  • 办公室的取暖费怎么做会计分录
  • 公司的私账合法吗
  • 哪些进项税不能转出
  • 吸收合并具体分录
  • 分支机构增值税汇总纳税如何申报?
  • 分公司开票信息
  • 上海中级会计报名入口
  • 怎么更正以前年度企业所得税
  • 资产负债表待摊费用出现负数
  • 电子商务出来干嘛
  • 物流公司油卡怎么抵税的
  • mac怎么设置桌面组件
  • php的核心
  • 银承到期后
  • 计提本月应缴纳的所得税
  • 工程收入和成本的区别
  • 织梦地图插件
  • 稿酬所得计入什么科目
  • php socket_create
  • php随机抽取
  • 现金流量表的编报时间有
  • 作废的专票能认证过去吗
  • 安装elementUI
  • 看了这篇文章感触很深的说说
  • html游戏大全
  • elasticsearch基本概念
  • 租店铺需要什么流程需要注意什么事项?
  • 研发费用没有发票怎么做账
  • 建筑施工企业收入怎么确认
  • LVS负载均衡群集的常用调度算法包含哪几种?
  • wordpress禁止更新插件
  • 高新技术企业研发人员比例要求
  • sql server添加语句
  • sqlserver2008数据库可疑
  • 旧设备入账
  • 建筑工程租赁费属于什么费用
  • 出货后90天付款
  • 农副产品收购分录
  • 用友软件数据导出
  • 一般纳税人商贸公司增值税税负率
  • 高新企业必须做加计扣除吗
  • 物业费的会计处理
  • 企业收到返利怎么做账
  • 普通发票的开具办法是?
  • 预收账款账务处理流程图
  • xp系统任务栏太小怎么办
  • 取消默认
  • ubuntu选择语言
  • vs显示进程已退出
  • Linux系统配置IP
  • windows取消隐藏文件夹
  • 五笔输入法怎么切换中文
  • ntldr文件在哪
  • windows8中文版是什么版本
  • javascript创建对象
  • js中事件的三要素
  • ssh远程登录脚本
  • 深入理解python特性 pdf
  • unity设置update间隔
  • js的判断类型
  • 要使物体从静止状态转变为运动状态需要对这个物体什么
  • html5 jquery
  • javascript巧用eval函数组装表单输入项为json对象的方法
  • 深圳市税务局好考吗
  • 上海市税务局招聘
  • 地税总局局长
  • 开票员怎么登录电子税务局进行开票验证
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设