文章目录

  • 1,添加水印
  • 2,图片截图
  • 3,上传多个图片同时并添加上水印

1,添加水印

选择上传一张图片,使用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.js
import 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("请先上传一张图片!")}// 获取截取的元素 这里直接获取imgconst 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,图片截图

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

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

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

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

代码如下:

 // 图片截图 使用了html2canvas插件screenShot() {if(!this.imgBase64){return alert("请先上传一张图片!")}// 获取截取的元素 这里直接获取imgconst 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, // 图片的base64watermark: 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数据转换为Blobvar 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;
}

vue - vue中实现对图片添加水印和截图的功能相关推荐

  1. Vue项目中加载图片的坑

    Vue项目中加载图片时,遇到的坑 1.当直接在标签中,使用图片路径,此时可以正常显示. <img src='img_src' /> 正常显示 2.当img标签的src属性为变量时,且该变量 ...

  2. 在vue.js中实现a标签href tel的打电话功能

    在vue.js中实现a标签href tel的打电话功能 div v-for="p in persons"> <p> name: {{ p.name }} < ...

  3. Vue项目中设置背景图片

    在Vue项目开发中我们经常要向页面中添加背景图片,可是当我们在样式中添加了背景图片后,编译打包后,配置到服务器上时,由于路径解析的问题,图片并不能够正确的显示出来,如下CSS样式: backgroun ...

  4. vue element-ui 中走马灯自适应图片高度

    图片自适应 废话不多说先上完整的代码 <template><div>{{img_height | add_px}}<el-carousel indicator-posit ...

  5. Vue项目中设置背景图片方法

    例如css样式 background:url("../../assets/head.jpg"); 1.在data中定义如下: export default { name: 'pro ...

  6. vue项目中使用百度地图api完成自定义搜索功能(包含搜索详细地理位置)

    需求描述: 在vue项目中,有时候,我们需要自定义百度地图的一些功能.譬如,现在的需求,就是需要自定义搜索内容和结果展示. 类似如下页面的功能: 首先在vue项目中,我们可以使用 vue-baidu- ...

  7. vue项目中的h5图片上传(处理上传的时候图片被旋转的问题,并压缩图片大小)

    vue的图片上传 这个页面实现的主要是实现创建球队功能,里面包含队徽,球队类型,球队名称,所属地址 这里除了图片上传还有一个地址的三级联动功能,这里我把这个页面都贴上来了.这个项目中使用vux作为ui ...

  8. vue项目中使用大图片提前预加载处理方案

    目的: 图片预加载能够使得用户在浏览后续页面的时候,不会出现图片加载一半导致浏览不流畅的情况. 方案一 项目打开的时候要对图片进行预加载,在App.vue里面的beforeCreate添加预加载程序 ...

  9. vue学习笔记一:vue项目中设置背景图片

    这几天在用vue开发一个项目,真的是到处都是坑啊,就连设置图片背景,也和前面用的不一样了,编译打包后,配置到服务器上时,由于路径解析的问题,图片并不能够正确的显示出来, background:url( ...

最新文章

  1. 最全面的homogeneous单应性坐标的定义,以及不同投影,仿射,相似,刚体变换矩阵的关系和自由度分析
  2. 入职谷歌、微软的大佬总结的刷题笔记.pdf
  3. 剑指Offer——当当+搜狐+好未来笔试题+知识点总结
  4. ASP.NET中常用到的27个函数集
  5. 将搜索二叉树转换成双向链表
  6. WordPress一个还不错的404html单页代码
  7. Django里面的sql查询语句
  8. 创业失败感悟第二十七天
  9. 2017-2018-1 20155328 《信息安全系统设计基础》第13周学习总结
  10. 如何从超级用户进入非超级用户
  11. mysql之 xtrabackup原理、备份日志分析、备份信息获取
  12. python之函数(function)
  13. 《程序设计导引及在线实践》开始
  14. matlab轴向柱塞泵动力学仿真,基于ADAMS柔性模型的轴向柱塞泵动力学仿真
  15. 基于CNN的人脸相似度检测
  16. j1900 nas安装windows蓝屏,无网卡连不上网
  17. 灰度拉伸python_对比度拉伸(一些基本的灰度变换函数)基本原理及Python实现
  18. verilog之分频大全
  19. 批处理系统、分时系统、实时操作系统的特点和比较
  20. python 多列排序_python sorted多列排序

热门文章

  1. Mark_Something
  2. Linux查找文件夹的名字
  3. [嵌入式方案][nrf51822] BLE HID+NUS的组合
  4. Python分析QQ群消息
  5. 2021-05 ISCC竞赛
  6. Chrome扩展程序添加CRX插件显示“程序包无效”
  7. 山西大学计算机系12级李晨阳,山西大学计算机智能与中文信息处理教育部重点实验室...
  8. 2021年UI设计就业前景和发展前景怎么样?
  9. 请运行命令来卸载Oracle主目录
  10. input输入框限制只能输入数字的方法