当前位置: 代码网 > it编程>编程语言>Javascript > vue之原生上传图片加水印并压缩图片大小方式

vue之原生上传图片加水印并压缩图片大小方式

2025年02月13日 Javascript 我要评论
vue原生上传图片加水印并压缩图片大小安装相应插件npm i -s compressorjsnpm i -s html2canvas封装添加水印的方法import compressor from

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>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com