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);
}
});
}
上传图片,回显图片
<template>
<div class="content-box">
<div class="container">
<div class="title">点击上传图像(支持image/jpg,image/jpeg,image/png,image/gif格式图片且大小不能超过10mb)</div>
<div class="uploadimg">
<span class="el-icon-plus"></span>
<input :accept="accept" type="file" class="upload_ipu" ref="fileload" @change="uploadimg" />
</div>
<div class="imglist">
<img v-if="imgshow" :src="imgsrc" />
</div>
<img v-if="imgshow" :src="fileurl" />
<!-- 图片上传水印 -->
<div id="markimg">
<div class="logo">
图片水印:
<img src="@/assets/logo.png" />
</div>
<p>文字水印:{{ loginname }}</p>
</div>
</div>
</div>
</template>
<script>
import { compressor, addwatermarker } from "../utils/imageutils.js";
import apis from "@/api";
const {
commonsys: { commonuploadfile },
} = apis;
export default {
props: {
accept: {
type: string,
default: "image/jpg,image/jpeg,image/png,image/gif",
},
},
data() {
return {
imgshow: false,
imgsrc: "",
loginname: "fqniu",
filedate: new date(),
needwatermark: true,
fileurl: "",
};
},
// created() {
// this.parsetime = parsetime
// },
methods: {
createurl(file) {
if (window.url) {
return window.url.createobjecturl(file);
} else if (window.webkiturl) {
return window.webkiturl.createobjecturl(file);
} else {
return null;
}
},
async uploadimg() {
// 这个是元素dom节点
console.log(this.$refs.fileload);
// 上传文件filelist
console.log(this.$refs.fileload.files);
let file = this.$refs.fileload.files[0];
let size = file.size / 1024 / 1024;
console.log(file, file.lastmodifieddate);
if (!this.accept.includes(file.type.tolowercase())) {
this.$message.error("图片格式不正确!");
return false;
}
if (size > 10) {
this.$message.error("图片大小不能超过10mb!");
return false;
}
// 压缩图片
// if (file.size > 512 * 1024 && file.type.includes("image/")) {
// file = await compressor(file);
// }
// 添加水印
if (this.needwatermark) {
const filename = file.name;
file = await addwatermarker(file, "#markimg", "leftdown");
file.name = filename;
}
this.imgsrc = this.createurl(file);
console.log(this.imgsrc);
console.log(file);
this.httprequest(file);
this.$message.success("上传成功!");
},
httprequest(fileobj) {
// let fileobj = param.file; // 相当于input里取得的files
console.log(fileobj);
let fd = new formdata(); // formdata 对象
fd.append("file", fileobj); // 文件对象
commonuploadfile("qms", fd).then((res) => {
console.log(res.fileurl);
this.fileurl = res.fileurl;
this.imgshow = true;
});
},
},
};
</script>
<style lang="scss" scoped>
.container {
margin: 50px;
}
.title {
font-size: 16px;
color: #73777b;
}
.uploadimg {
margin-top: 20px;
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
width: 180px;
height: 180px;
transition: all 0.2s;
background: #fff;
&:hover {
border-color: #409eff;
}
span {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.upload_ipu {
opacity: 0;
width: 100%;
height: 100%;
position: absolute;
cursor: pointer;
top: 0;
left: 0;
z-index: 2;
}
img {
width: 178px;
height: 178px;
position: absolute;
border-radius: 6px;
left: 0;
top: 0;
z-index: 1;
}
}
.imglist {
width: 550px;
height: 400px;
img {
width: 100%;
height: 100%;
}
}
// 水印样式
#markimg {
position: absolute;
left: -9999999px;
text-align: left;
padding: 10px 15px;
.logo {
font-weight: 600;
font-size: 15px;
color: #ffffff;
display: flex;
height: 21px;
align-items: center;
justify-content: flex-start;
img {
height: 21px;
margin-right: 5px;
}
}
p {
margin-top: 6px;
color: #ffffff;
font-size: 12px;
font-weight: 400;
}
}
</style>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论