El-Upload组件上传图片并添加水印

news/发布时间2024/5/20 9:19:42

背景

有的时候我们需要在上传图片中添加一些水印标识,然后上传至服务器

效果图

代码

<template><div class="app"><!--    需求:1. 点击直接预览图片,而不需要使用dialog2. 上传图片添加水印后才预览图片思路:上传图片文件添加水印。使用watermarkjs库转换将添加水印的图片转换成base64,更新预览图片的内容保存添加水印后的文件自行上传服务器....--><el-uploadaction=""list-type="picture-card":multiple="true":on-change="handleUploadChange":auto-upload="false"><i slot="default" class="el-icon-plus"></i><div slot="file" slot-scope="{ file }"><img class="el-upload-list__item-thumbnail" :src="file.url" alt="" /><span class="el-upload-list__item-actions"><spanclass="el-upload-list__item-preview"@click="handlePictureCardPreview(file)"><i class="el-icon-zoom-in"></i><!-- <el-imagestyle="width: 100px; height: 100px":src="dialogImageUrl":preview-src-list="[dialogImageUrl]"></el-image> --></span><span class="el-upload-list__item-delete" @click="handleRemove(file)"><i class="el-icon-delete"></i></span></span></div></el-upload><!-- 预览图片方式1:使用dialog方式<el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt="" /></el-dialog> --><!-- 预览图片方式2:使用image-viewer --><el-image-viewerv-if="imgViewerVisible":url-list="imgList":on-close="closeImgViewer"/><div class="demo" ref="demoRef"></div></div>
</template><script>
import watermark from 'watermarkjs'
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'export default {components: {ElImageViewer,},data() {return {dialogImageUrl: '',dialogVisible: false,imgViewerVisible: false,imgList: [],}},methods: {handlePictureCardPreview(file) {// this.dialogImageUrl = file.url// this.dialogVisible = truethis.imgViewerVisible = truethis.imgList = [file.url]// 解决预览放大后滚动鼠标页面跟着滚动的问题const m = (e) => {e.preventDefault()}document.body.style.overflow = 'hidden'document.addEventListener('touchmove', m, false) // 禁止页面滑动},closeImgViewer() {this.imgViewerVisible = falseconst m = (e) => {e.preventDefault()}document.body.style.overflow = 'auto'document.removeEventListener('touchmove', m, true)},handleRemove(file) {console.log(file)},handleUploadChange(file, fileList) {// console.log('file:', file)// console.log('fileList:', fileList)const upload_file = file.raw// 1. 添加单个水印// watermark([upload_file])//   .image(//     watermark.text.upperRight(//       'watermark.js',//       '48px Josefin Slab',//       '#fff',//       0.5,//       48//     )//   )//   .then((img) => {//     img.style.width = '300px'//     img.style.height = 'auto'//     this.$refs.demoRef.append(img)//   })// 2. 添加多个水印// watermark([upload_file])//   .image(//     watermark.text.upperRight(//       '呵呵呵',//       '48px Josefin Slab',//       '#fff',//       0.5,//       48//     )//   )//   .render()//   .image(//     watermark.text.upperLeft(//       '哈哈哈',//       '48px Josefin Slab',//       '#fff',//       0.5,//       48//     )//   )//   .then((img) => {//     img.style.width = '300px'//     img.style.height = 'auto'//     this.$refs.demoRef.append(img)//   })// 3. 自定义添加水印位置,比如:设置在右上角// @param {HTMLCanvasElement} canvas// @param {TextMetrics} metrics// @param {CanvasRenderingContex2D} context - context of the canvas// 设置水印的x坐标var x = function (canvas, metrics, context) {// 微调,比如:-20  根据实际调整return canvas.width - metrics.width - 20}// 设置水印的y坐标var y = function (canvas, metrics, context) {return metrics.hangingBaseline + 10}watermark([upload_file]).image(watermark.text.atPos(x,y,'上传时间:2024-05-08 22:40:10','48px sans-serif','#fff',0.8)).then((img) => {// img.style.width = '300px'// img.style.height = 'auto'this.$refs.demoRef.append(img)// 将base64转文件形式const watermark_file = this.dataURLtoFile(img.src, file.name)// 下载文件// this.downloadFile(watermark_file)this.transformFileToBase64(watermark_file, file)})},// 将base64转文件dataURLtoFile(dataurl, filename) {var arr = dataurl.split(','),mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]),n = bstr.length,u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new File([u8arr], filename, { type: mime })},// 下载文件downloadFile(file) {let aTag = document.createElement('a') //创建一个a标签aTag.download = file.namelet href = URL.createObjectURL(file) //获取urlaTag.href = hrefaTag.click()URL.revokeObjectURL(href) //释放url},// 将水印文件转换成base64,然后修改原有file对象的url,这样保证预览时图片的url是带有水印的transformFileToBase64(watermark_file, file) {return new Promise((resolve, reject) => {// 读取文件const reader = new FileReader()//readAsDataURL()方法: 读取文件内容,结果用data:url的字符串形式表示reader.readAsDataURL(watermark_file)// 读取成功回调reader.onload = () => {file.url = reader.result}})},},
}
</script><style lang="less" scoped></style>

参考文档

  • FileReader()读取文件、图片上传预览
    https://www.cnblogs.com/libo-web/p/15766987.html
  • Element-ui中 使用图片查看器(el-image-viewer) 预览图片
    https://juejin.cn/post/7084856145277354020

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

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

相关文章

Windows平台git clone文件路径太长报错

解决文件路径太长导致的报错问题问题描述 在Windows下拉取一些比较大的开源项目经常会提示文件路径太长(filename too long),然后死活都不成功 解决办法 1.配置git git config --system core.longpaths true2.修改文件C:\Program Files\Git\etc\gitconfig(需要以管理员身份…

docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群

docker搭建redis集群(三主三从)及重启redis集群 一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤: docker pull redis:6.0.82、查看本地拉取到镜像文件docker images 看到图上标识,就说明当前…

ISCC线上赛2023

ISCC线上赛2023 web web1双重base解码得到flag web3 F12控制台查看可找到loveStory.php Enc.php download.php,loveStory.php为反序列源码 boy::__destruct() -->girl()::__call()-->helper()::__isset()-->boy()::__toString()-->helper()::__get()-->love_st…

tomcat的cookie报错

1.File–>project structure -> Modules(+)–>java—>选择servlet-api.jar 需要添加servlet.api.jar包依赖

[转帖]Oracle Linux 9.3 正式版发布 - Oracle 提供支持 RHEL 兼容发行版

sysin2023-11-21 上海 阅读 5 分钟 Oracle Linux 9.3 正式版发布 - Oracle 提供支持 RHEL 兼容发行版 Oracle Linux with Unbreakable Enterprise Kernel (UEK) & Red Hat compatible kernel (RHCK) 请访问原文链接:https://sysin.org/blog/oracle-linux-9/,查看最新版。…

OpenVX技术图例(一)

OpenVX技术图例(一) 参考文献链接 https://registry.khronos.org/OpenVX/specs/1.1/html/index.html人工智能芯片与自动驾驶