vue中使用canvas给图片绘制水印,即使下载图片也是带水印的

news2025/1/11 5:07:28

先看效果

话不多说直接上组件

1、Watermark.vue

<template>
  <div>
    <canvas ref="canvas" :width="width" :height="height"></canvas>
  </div>
</template>

<script>

export default {
  props: {
    // 图片地址
    url: {
      type: String,
      required: true,
      default: 'https://img0.baidu.com/it/u=3232582821,3516640051&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1706288400&t=0bcdcc70fdc82051783cb93e87102657'
    },
    // 图片宽
    width: {
      type: Number,
      required: true,
      default: 400
    },
    // 图片高
    height: {
      type: Number,
      required: true,
      default: 300
    },
    // 水印行数
    rows: {
      type: Number,
      required: true,
      default: 3
    },
    // 水印列数
    cols: {
      type: Number,
      required: true,
      default: 3
    },
    // 水印的文字
    text: {
      type: String,
      required: true,
      default: 'Watermark'
    }
  },
  mounted() {
    this.drawWatermark();
  },
  methods: {
    drawWatermark() {
      const canvas = this.$refs.canvas;
      const ctx = canvas.getContext('2d');
      const image = new Image();
      image.src = this.url

      image.onload = () => {
        ctx.drawImage(image, 0, 0, this.width, this.height);
        ctx.font = '20px Arial';
        ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
        const stepX = this.width / this.cols;
        const stepY = this.height / this.rows;
        for (let i = -1; i <= this.cols; i++) {
          for (let j = -1; j <= this.rows; j++) {
            const x = i * stepX + stepX / 2;
            const y = j * stepY + stepY / 2;
            ctx.save();
            ctx.translate(x, y);
            ctx.rotate(-Math.PI / 6);
            ctx.fillText(this.text, 0, 0);
            ctx.restore();
          }
        }
      };
    },
  },
}
</script>

2、使用

 <Watermark
       :url="'https://img2.baidu.com/it/u=1814561676,2470063876&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1706288400&t=5c5fb8f24cad1dcb6d526aae674623b0'"
       :width="400"
       :height="300"
       :rows="3"
       :cols="3"
       :text="'water--mark'"
       ></Watermark>

3、注意

图片的宽高和水印的行数列数,需要你自己调整,

你的图片需要显示什么宽高就写多少,

然后去调整几行几列能铺满,调整到铺满整个图片适宜为止,

该组件该有可以补充的地方,比如水印大小,水印颜色等,可以自己动手补充哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux命令拓展

一、tr - 字符转换 效果展示&#xff1a; 将小写转换成大写 字符压缩 通式&#xff1a;tr -s 字符删除 通式&#xff1a;tr -d 补集 通式&#xff1a;tr -c 用法&#xff1a;随机密码 二、cut - 提取 通式&#xff1a;cut [选项] 文件 选项&#xff1a; -d&#xff1a;分隔符…

RT-Thread: 串口操作、增加串口、串口函数

说明&#xff1a;本文记录RT-Thread添加串口的步骤和串口的使用。 1.新增串口 官方链接&#xff1a;https://www.rt-thread.org/document/site/rtthread-studio/drivers/uart/v4.0.2/rtthread-studio-uart-v4.0.2/ 新增串口只需要在 board.h 文件中定义相关串口的宏定…

构建未来学堂:在线教育系统开发技术实践

在当今数字化时代&#xff0c;在线教育系统的开发越发显得至关重要。本文将带你深入了解在线教育系统的开发&#xff0c;涉及到关键的技术实践和代码示例。我们将采用现代化技术栈&#xff0c;为未来学堂的搭建提供实用的指南。 技术栈选择 在开始实际的开发之前&#xff0c…

ETL能实现什么流程控制方式?

随着大数据时代的到来&#xff0c;数据处理工具成为各个行业中不可或缺的一部分。运用数据处理工具&#xff0c;能够大幅度帮助开发人员进行数据处理等工作&#xff0c;以及能够更好的为企业创造出有价值的数据。那在使用ETL工具时&#xff0c;我们往往会通过ETL平台所携带的组…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-11 HTML5 表单验证

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 表单验证</title> </head><body> <form action"#" method"get" novalidate>请输入您的邮箱:<input type&q…

训练YOLOv5模型(云端GPU)

Colab 选择GPU 查看配置 ! nvidia-smi上传压缩包并解压 压缩包 -> 解压的文件 !unzip /content/yolov5-5.0.zip -d/content/yolov5进入目标文件夹下 %cd /content/yolov5/yolov5-5.0安装所需包package !pip install -r requirements.txt添加插件-Tensorboard 失败的话…

matlab绘图杂谈-stem函数和plot函数

出发点 今天在论文中看到一副这样的图&#xff0c;它既有曲线&#xff0c;又有点&#xff0c;并且对两者都添加了图例。三条曲线应该是用plot函数绘制的&#xff0c;而target哪个绿色的圆圈&#xff0c;我的理解是用stem函数绘制的。它只是1个点&#xff0c;并且没有竖线&…

qwt直角坐标 画sing(x)/x

cmath的常见函数&#xff1a;qPow()求平方&#xff0c;log(&#xff09;对数10为底 角度转弧度&#xff1a;x(angel/180)*M_PI 图示&#xff1a; 头文件&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <qwt_plot.h> #in…

【学术论文写作 笔记03】消融实验(ablation study)写作的行文逻辑

文章目录 一、声明二、行文逻辑三、示例示例一示例二 四、常用短语&#xff08;未完&#xff09; 一、声明 自己总结的&#xff0c;有问题望指正&#xff01; 二、行文逻辑 总述&#xff1a;在什么数据集上测试了关于什么参数或模块的消融实验实验是怎么做的实验结论是什么 …

Java工程师的你,真的不想了解一下《类加载器详解》吗?(重点)

Java工程师的你&#xff0c;真的不想了解一下《类加载器详解》(重点)吗&#xff1f; 文章目录 Java工程师的你&#xff0c;真的不想了解一下《类加载器详解》(重点)吗&#xff1f;回顾一下类加载过程类加载器类加载器介绍类加载器加载规则类加载器总结自定义类加载器 双亲委派模…

ElasticSearch搜索引擎入门到精通

ES 是基于 Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的数据,相对于 MySQL 来说不擅长经常更新数据及关联查询。这篇文章就是为了进一步了解一下它,到底是如何做到这么高效的查询的。 在学习其他数据库的时候我们知道索引是一个数据库系统极其重要…

机器学习实验1——朴素贝叶斯和逻辑回归分类Adult数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;数据预处理&#x1f9e1;&#x1f9e1;认识数据填充缺失值&#xff08;“ &#xff1f;”&#xff09;将income属性替换为0-1变量筛除无效属性编码和缩放 &#x1f9e1;&…

【SpringBoot篇】springboot的自动装配原理

文章目录 &#x1f3f3;️‍&#x1f308;什么是自动装配&#x1f339;SpringBoot的自动装配&#x1f354;具体操作 &#x1f3f3;️‍&#x1f308;什么是自动装配 自动装配&#xff08;Auto-Configuration&#xff09;是Spring Boot框架的一个核心特性之一&#xff0c;它通过…

Windows10手动取消更新

因为我的设备是比较老了&#xff0c;担心升级Windows11后硬件跟不上&#xff0c;所以不想更新Windows11&#xff0c;但系统一遍又一遍的提醒更新&#xff0c;这时候就可以手动停止更新了 1、Win R&#xff0c;在对话框然后输入命令 services.msc 2、点击确定进入服务管理&…

MNIST手写数据集项目

import torch import torch.nn as nn import torch.nn.functional as F import torchvision from torchvision import transforms from PIL import Image import matplotlib.pyplot as plt import numpy as np一、数据处理部分 ①定义数据转换 ②加载训练和测试数据&#xff…

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

输入框内容和占位符过长悬浮提示

1. 输入框内容过长&#xff0c;内容悬浮提示 <el-tooltip :disabled"isShowTooltip" effect"dark" :content"formData.toChineseCode" placement"top"><el-inputv-model"formData.toChineseCode"mouseover.native&…

【开源项目】超经典开源项目实景三维数字孪生海洋牧场、海上平台

飞渡科技数字孪生海上运营平台&#xff0c;基于数字孪生、物联网IOT、远程控制与遥感等技术&#xff0c;结合前端智能感知设备数据和专业模型算法&#xff0c;对海洋养殖环境、船只、网箱、监测设备等各要素态势进行综合监测分析&#xff0c;对各类异常事件进行可视化预警、告警…

微信开放平台第三方授权(第一篇)

1.项目需要的功能 需求不可以用微信原有的开发接管方式&#xff0c;之后发现可以进行第三方授权。先登录微信开放平台&#xff0c;找到第三方平台。 微信开放平台 配置第三方平台 基本概念介绍 | 微信开放文档 进入到管理配置 以上连接配置参考 接收授权事件&#xff1a;h…

深度解析Java8社招面试题:Lambda序列化到底行不行?

大家好&#xff0c;我是小米&#xff0c;一个热爱技术分享的小伙伴。今天&#xff0c;我们来聊一个关于Java8的话题&#xff0c;一个颇具技术深度的问题&#xff1a;“社招面试题&#xff1a;Java8中的Lambda表达式可以序列化吗&#xff1f;”废话不多说&#xff0c;让我们一起…