vue之原生上传图片加水印并压缩图片大小方式
目录
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-04javascript解码揭秘,JavaScript核心原理及高效编码技巧之谜?
- 02-04javascript电子书涵盖哪些编程技巧与实战案例,适合哪些开发者阅读?
- 02-04JavaScript如何高效操作javascript二维数组的元素和方法选择?
- 02-04JavaScript全局变量如何影响代码的模块化和性能优化?
- 02-04javascript赋值
- 02-04a标签javascript如何正确运用和优化?探讨技巧与最佳实践疑问长尾标题
- 02-04javascript设计
- 02-04JavaScript翻译中的常见难点和高效策略探讨?
- 02-04javascript变量名
- 02-04JavaScript隐藏技巧,揭秘30种不为人知的隐藏方法之谜?
阅读排行
推荐教程
- 02-01如何选择最适合你的JavaScript视频教程?
- 04-23JavaScript Array实例方法flat的实现
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 07-21JavaScript判断数据类型的四种方式总结
- 07-21基于vue3与supabase系统认证机制详解
- 07-22JavaScript随机数生成各种技巧及实例代码
- 07-21JavaScript检查变量类型的常用方法
- 04-23vue3+ts项目搭建的实现示例
- 07-21JavaScript双问号操作符(??)的惊人用法总结大全
