vue之原生上传图片加水印并压缩图片大小方式
时间:2025-01-24 16:41:32|栏目:JavaScript|点击: 次
目录
vue原生上传图片加水印并压缩图片大小
安装相应插件
npm i -S compressorjs npm i -S html2canvas
封装添加水印的方法
import Compressor from "compressorjs"; import html2canvas from "html2canvas"; /** * 压缩和旋转图片 * @param {blob} file * @param {number} quality 压缩比例 * @param {number} maxWidth 图片最大宽度 * @returns {Promise} */ export function compressor(file, drew, maxWidth = 750, quality = 0.6) { return new Promise((resolve) => { new Compressor(file, { strict: false, maxWidth, quality, drew, success: resolve, error(err) { console.log(err.message); }, }); }); } /** * 添加水印 * @param {blob} file * @param {string} el * @returns {Promise} */ export async function addWaterMarker(file, el = "#markImg", direction = "rightDown") { return new Promise(async (resolve, reject) => { try { const maxWidth = 750; const img = await blobToImg(file); console.log(img.naturalWidth); const imgWidth = img.naturalWidth > maxWidth ? maxWidth : img.naturalWidth; // 生成水印图片 const markEle = document.querySelector(el); const scale = (imgWidth * 0.25) / markEle.clientWidth; // 先缩放水印再转成图片 markEle.style.transform = `scale(${scale})`; const markImg = await htmlToCanvas(markEle); // 先压缩和旋转图片 file = await compressor( file, (context, canvas) => { if (direction == "rightDown") { // 填充水印 右下角 context.drawImage(markImg, canvas.width - markImg.width - 15 * scale, canvas.height - markImg.height - 15 * scale, markImg.width, markImg.height); } else { // 填充水印 左下角 context.drawImage(markImg, 15 * scale, canvas.height - markImg.height - 15 * scale, markImg.width, markImg.height); } }, maxWidth ); resolve(file); } catch (error) { reject(error); } }); } function blobToImg(blob) { return new Promise((resolve, reject) => { let reader = new FileReader(); reader.addEventListener("load", () => { let img = new Image(); img.src = reader.result; img.addEventListener("load", () => resolve(img)); }); reader.readAsDataURL(blob); }); } export function htmlToCanvas(el, backgroundColor = "rgba(0,0,0,.1)") { return new Promise(async (resolve, reject) => { try { const markImg = await html2canvas(el, { scale: 2, allowTaint: false, //允许污染 useCORS: true, backgroundColor, //'transparent' //背景色 }); resolve(markImg); } catch (error) { reject(error); } }); }
上传图片,回显图片
点击上传图像(支持image/jpg,image/jpeg,image/png,image/gif格式图片且大小不能超过10MB)![]()
图片水印:![]()
文字水印:{{ loginName }}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持科站长。
上一篇:JavaScript中11种常用的hook钩子技术及示例代码
栏 目:JavaScript
本文地址:https://fushidao.cc/wangluobiancheng/3095.html
您可能感兴趣的文章
- 02-11js中基本事件的总结(onclick、onblur、onchange等)
- 02-11详解如何在Node.js中使用中间件处理请求
- 02-11Vue3中Provide和Inject的用法及工作原理详解
- 02-11Vue+vant实现图片上传添加水印
- 02-11快速解决 keep-alive 缓存组件中定时器干扰问题
- 02-11uniapp 使用 tree.js 解决模型加载不出来的问题及解决方法
- 02-11基于uniapp vue3 的滑动抢单组件实例代码
- 02-10JavaScript 中的 Map使用指南
- 02-10vue3中使用print-js组件实现打印操作步骤
- 02-10Vue 中v-model的完整用法及v-model的实现原理解析


阅读排行
推荐教程
- 04-23JavaScript Array实例方法flat的实现
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23vue3+ts项目搭建的实现示例
- 04-23JavaScript实现下载超大文件的方法详解
- 04-23vue如何使用pdf.js实现在线查看pdf文件功能
- 04-23vue.js调用python脚本并给脚本传数据
- 12-18使用JavaScript遍历输出页面中的所有元素的方法详解
- 04-23JS加密解密之保存到桌面书签
- 12-18Vue实现滚动加载更多效果的示例代码