首页 > 其他分享 >vue3批量将图片添加水印并导出压缩包

vue3批量将图片添加水印并导出压缩包

时间:2024-03-29 16:55:47浏览次数:26  
标签:canvas const img ctx 水印 vue3 压缩包

vue3批量将图片添加水印并导出压缩包

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import JSZip from 'jszip'

const img_list = ref([
  { img: 'https://img.keaitupian.cn/uploads/2020/07/20/zv2owzexj5i.jpg' },
  { img: 'https://img.keaitupian.cn/uploads/2020/12/08/273813a415dbe086179ec092b693e8bb.jpg' },
  { img: 'http://n.sinaimg.cn/sinacn10106/159/w1080h1479/20190703/4cf3-hzfekep2552738.jpg' },
  { img: 'http://pic.bizhi360.com/bbpic/23/323.jpg' },
])

/**
* 根据图片的url转换对应的base64值,并添加水印
* @param { String } imageUrl 如:http://xxxx/xxx.png
* @returns base64取值
*/
const urlToBase64WithWatermark = (imageUrl, watermarkText) => {
  return new Promise((resolve, reject) => {
    let canvas:any = document.createElement('canvas');
    const ctx:any = canvas.getContext('2d');
    let img:any = new Image();
    img.crossOrigin = 'Anonymous'; // 解决Canvas.toDataURL 图片跨域问题
    img.src = imageUrl;
    img.onload = function () {
      canvas.height = img.height;
      canvas.width = img.width;
      ctx.drawImage(img, 0, 0); // 将图片绘制到画布上

      // 添加水印
      ctx.font = '30px Arial'; // 设置字体大小和字体
      const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height); // 创建从左上角到右下角的线性渐变
      gradient.addColorStop(0, '#666');
      gradient.addColorStop(0.5, '#666');
      gradient.addColorStop(1, '#666');
      ctx.fillStyle = gradient; // 颜色

      const watermarkWidth = ctx.measureText(watermarkText).width; // 计算水印文本的宽度

      for (let x = 0; x < canvas.width; x += watermarkWidth * 1.5) { // 水平方向上以水印文本宽度的1.5倍间隔
        for (let y = 0; y < canvas.height; y += 200) { // 垂直方向上以200像素间隔
          ctx.save(); // 保存当前绘图状态
          ctx.translate(x, y); // 移动绘图原点到当前位置
          ctx.rotate(-0.9); // 旋转文字
          ctx.fillText(watermarkText, 0, 0); // 在当前位置绘制水印
          ctx.restore(); // 恢复之前保存的绘图状态
        }
      }

      const dataURL = canvas.toDataURL('image/jpeg', 1); // 获取Base64编码
      resolve(dataURL);
      canvas = null; // 清除canvas元素
      img = null; // 清除img元素
    };
    img.onerror = function () {
      reject(new Error('Could not load image at ' + imageUrl));
    };
  });
}

const downloadImagesWithWatermark = async () => {
  const zip = new JSZip();
  for (const image of img_list.value) {
    const data:any = await urlToBase64WithWatermark(image.img, '测试水印');
    // 添加到压缩包
    zip.file(`${image.img.split('/').pop()}.jpg`, data.split('base64,')[1], { base64: true });
  }
  // 生成压缩包
  const content = await zip.generateAsync({ type: 'blob' });
  // 下载压缩包
  const link = document.createElement('a');
  link.href = URL.createObjectURL(content);
  link.download = 'images_with_watermark.zip';
  link.click();
}

onMounted(async () => {
  await downloadImagesWithWatermark();
})
</script>


标签:canvas,const,img,ctx,水印,vue3,压缩包
From: https://www.cnblogs.com/newBugs/p/18104163

相关文章

  • Vue组件封装:基于Vue3+wangeditor富文本组件二次封装
    1.简介    开源Web富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用户的问题,产出自己的价......
  • 一个vue3指令,兼容pc与移动端的拖动tab切换,鼠标拖动与触摸拖动触控监听
    <Viewclass="app-tabs-container":class="{appear:state.showTabsTrans}"v-tabs-pointer-event:[state.hasMove]="handleProductChange"><router-viewv-slot="{Component}"><KeepAlive>......
  • MybatisPlus多参数分页查询,黑马程序员SpringBoot3+Vue3教程第22集使用MP代替pagehelpe
    前言:视频来源1:黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关视频来源2:黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架创作理由:网上MP实现分页查询功能的帖子易读性太差,具体实现看下面。根据视频完成......
  • vue3项目数字金额转大写
    consttoUpperCaseAmount=(value)=>{ //将数字金额转换为大写的逻辑 constdigitUppercase=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']; constunit=[......
  • 盲水印脚本安装说明_bwm、_bwmforpy
    此工具需要python2/python3脚本下载地址https://gitcode.com/chishaxie/BlindWaterMark/tree/master?utm_source=csdn_blog_hover直接下载压缩包解压在python里面添加两个库,python.exe目录上方输入cmdpipinstallopencv-pythonpython.exe-mpipinstallmatplotlib我......
  • Python对PDF文件加密和添加水印大揭秘!
    ​Python这个编程语言,不仅因为它语法简洁易懂,还因为它能帮我解决各种实际问题。最近我就用Python给PDF文件加了密,还添了个酷炫的水印,感觉自己瞬间变成了文件安全的小能手!首先,得说说这个PDF加密。你知道吗,现在网上各种资料满天飞,保护自己的文档不被他人随意查看变得尤为重要......
  • vue3 mitt事件总线,组件之间通信,通信范围不在局限于父子组件之间
    vue2使用的EventBus事件总线在vue3已经被弃用了;vue3使用的事件总线为mitt,可用父子组件,兄弟组件之间通信我使用的方法如下新建一个mitt.ts文件保存以下内容importmitts,{Emitter}from"mitt";//定义类型别名,因全局使用并且需要自定义事件名称,所以使用索引签名......
  • vue3子组件给父组件传参,父组件给子组件传参,在父组件中直接调用子组件中的某个方法
    vue3子组件给父组件传参,父组件给子组件传参,在父组件中直接调用子组件中的某个方法1、子传父,以传递id为例子:constemit=defineEmits(['passId']);//在需要传递的参数的地方写,id为需要传递的参数emit('passId',id); 父://引入子组件constSonPage=defineAsyncCo......
  • 解决vue3项目中四周留白的原因
    留白原因:vue3中body有默认属性margin:8px。body{display:block;margin:8px;}如何解决:需要在vue项目中对根目录的index.html进行代码添加<style>body{margin:0;}</style>index.html完整代码:<!DOCTYPEhtml><htmllang="en">&......
  • vue3 - 最新手机扫码PC网站二维码登录功能,用手机端扫描PC端vue3网页的登录二维码,然后
    效果图在vue3开发中,详细实现“PC电脑网站生成微信登录二维码+手机扫码登录+双端同步数据”,利用扫码实现网站登录功能、用户用手机扫描电脑端二维码进行登录的详细教程步骤(电脑端PC网页、手机端都是vue3开发,支持将手机端改造成微信小程序、uniapp安卓苹果app、H5网页等。)......