欢迎来到科站长!

JavaScript

当前位置: 主页 > 网络编程 > JavaScript

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);
    }
  });
}

上传图片,回显图片







总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持科站长。

上一篇:JavaScript中11种常用的hook钩子技术及示例代码

栏    目:JavaScript

下一篇:vue图片压缩与批量上传方式

本文标题:vue之原生上传图片加水印并压缩图片大小方式

本文地址:https://fushidao.cc/wangluobiancheng/3095.html

广告投放 | 联系我们 | 版权申明

申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:257218569 | 邮箱:257218569@qq.com

Copyright © 2018-2025 科站长 版权所有冀ICP备14023439号