项目中预览图片时,添加水印,浏览器禁止右键功能、前端禁止直接获取图片地址。(Vue3、TS、canvas)

  • 在src/utils文件夹下新建watermark.ts,写入以下代码块,生成水印文件
// 导出函数 getWatermark,它返回一个对象,其中包含一个名为 watermark 的方法。
export const getWatermark = () => {const setWatermark = (str: any) => {const id = '1.23456789.123456789';if (document.getElementById(id) !== null) {document.body.removeChild(document.getElementById(id)!);}// 1.创建一个 <canvas> 元素,用于绘制水印。const can = document.createElement('canvas');// 2.设置 <canvas> 元素的宽度和高度为 160 像素和 120 像素。can.width = 160;can.height = 120;// 3.获取 2D 绘图上下文对象 cans。const cans = can.getContext('2d')!;// 4.通过旋转角度将绘图上下文对象旋转 -15 度。cans.rotate((-15 * Math.PI) / 180);// 5.设置绘图字体为 '18px Vedana'。cans.font = '18px Vedana';// 6.设置填充绘图颜色为 'rgba(200, 200, 200, 0.40)'。cans.fillStyle = 'rgba(200, 200, 200, 0.40)';// 7.设置文本对齐方式为左对齐。cans.textAlign = 'left';// 8.在画布上绘制水印文本,位置为 (can.width / 8, can.height / 2)。cans.fillText(str, can.width / 8, can.height / 2);// 9.创建一个 <div> 元素,用于包裹水印。const div = document.createElement('div');// 10.设置 <div> 元素的属性,包括 id、pointerEvents、top、left、position、zIndex、width 和 height。div.id = id;div.style.pointerEvents = 'none';div.style.top = '30px';div.style.left = '0px';div.style.position = 'fixed';div.style.zIndex = '100000';div.style.width = document.documentElement.clientWidth + 'px';div.style.height = document.documentElement.clientHeight + 'px';// 11.将 <div> 元素的背景设置为生成的水印图像。div.style.background ='url(' + can.toDataURL('image/png') + ') left top repeat';// 12.将 <div> 元素添加到 <body> 元素中。document.body.appendChild(div);// 13.返回水印的 id。return id;};// 14.定义内部函数watermark,接受一个参数 str,代表水印文本。这个函数的作用是调用 setWatermark 方法创建水印,并定时检查水印是否存在,如果不存在则重新创建。当窗口大小改变时,也会重新创建水印。const watermark = (str: string) => {let id = setWatermark(str);setInterval(() => {if (document.getElementById(id) === null) {id = setWatermark(str);}}, 500);window.onresize = () => {setWatermark(str);};};// 15.函数 getWatermark 返回一个对象,其中包含一个属性 watermark,它的值是内部函数 watermark。这样,当调用 getWatermark().watermark 时,实际上是调用了内部函数 watermark。return { watermark };
};
  • 引入getWatermark函数,进行使用,示例代码如下:
import { getWatermark } from '@/utils/watermark';const { watermark } = getWatermark();
// 打开图片进行预览和关闭预览时
const previewChange = () => {viewFlag.value = !viewFlag.value;if (viewFlag.value) { // 打开预览watermark('水印水印水印'); // 水印} else { // 关闭预览watermark('');}};
  • 禁止浏览器右键下载预览图片,示例代码如下:
document.oncontextmenu = function () {// 禁止右键功能return false;
};
  • 所以上面示例代码可整合为:
const previewChange = () => {viewFlag.value = !viewFlag.value;if (viewFlag.value) { // 打开预览watermark('水印水印水印'); // 水印document.oncontextmenu = function () {//禁止右键功能return false;};} else { // 关闭预览document.oncontextmenu = function () {return true;};watermark('');}};
  • 防止使用F12打开控制台,所以获取图片地址方式为:前端根据数据库存储的图片路径,获取路径后到后端服务器上获取图片再到前端展示。
src = https://192.xxx.xx.xx:0000/api/showImg?filePath=/home/uploadfiles/pit/1234567890abcdefghijklmn

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

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

相关文章

Java基础知识总结(29)

Java虚拟机 运行时数据区 程序计数器 方法区&#xff1a;Java 8以后没有方法区&#xff0c;改为了元空间&#xff08;MetaSpace&#xff09; 虚拟机栈 堆 本地方法栈 程序计数器 它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c…

flutter生成二维码并截图保存到图库

引入库&#xff1a;flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局 import dart:async; import dart:typed_data; import package/generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/ImageWaterMarkUtil.dart; im…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求&#xff0c;添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现&#xff0c;那怎么样才能实现这一过程&am…

25Ramdisk 启动模式简介

Ramdisk 启动模式简介 ramdisk是一种虚拟磁盘技术,我们的PE系统几乎都是使用ramdisk方式从计算机启动的.那么,ramdisk有哪些特点呢? Ramdisk 将内存虚拟为一个磁盘 Ramdisk技术会将你的一部分内存虚拟成一块磁盘分区.使用U盘启动pe系统时,打开pe系统里的文件资源管理器,你会看…

CKS之安全沙箱运行容器:gVisor

目录 一、gVisor介绍 二、gVisor架构 三、gVisor使用前置条件 四、Docker中使用gVisor 五、containerd中使用gVisor 六、Kubernetes结合gVisor使用 一、gVisor介绍 gVisor是Google开源的一种容器沙箱技术&#xff0c;其设计初衷是在提供较高安全性的同时&#xff0c;尽量…

Stable Diffusion 推荐硬件配置和本地化布署

Stable Diffusion简介 Stable Diffusion是由Stability AI开发的一种强大的文本到图像(Text-to-Image)生成模型,它能够根据用户提供的文本描述,生成与之相关的高质量、高分辨率图像。下面我从原理、特点、应用三个方面对Stable Diffusion作简要介绍: 1、原理:Stable Diffusion…

从输入url到页面展示的过程

唠唠叨&#xff1a;我不想误人子弟&#xff0c;我这篇算是搬运工&#xff0c;加上自己的理解做点总结&#xff0c;所以还请大家科学上网去看这篇&#xff1a;https://aws.amazon.com/cn/blogs/mobile/what-happens-when-you-type-a-url-into-your-browser/ 是这六个步骤&#…

杰发科技——Jlink插件使用

0. 简介 杰发自带的烧录工具是ATCLink&#xff0c;基于DapLink适配。个人不太喜欢ATCLink&#xff0c;推荐使用Jlink&#xff0c;毕竟自己买&#xff0c;不用问原厂要&#xff0c;而且带Jlink&#xff0c;至少5Mhz以上。 V9烧录器使用7.50以下版本驱动。 V11烧录器可以使用7…

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜 墨天轮墨天轮国产数据库流行度排行PolarDB首度夺魁关于话题的讨论数据库流行度排行榜会影响你的数据库选型吗&#xff1f;对于 PolarDB 的本次登顶&#xff0c;你认为关键因素是什么&#xff1f;PolarDB“三层分离”新版…

【Review】小米汽车发布会

动力方面 顶配双电机四驱&#xff0c;小米超级电机21000转&#xff0c;最大马力673ps&#xff0c;峰值功率495kW&#xff0c;峰值扭矩838N.m。风阻系数最低0.195&#xff0c;零百加速最快2.78秒&#xff0c;时速最高265km/h。 底盘方面 前双叉臂&#xff0c;后无五连杆&#xf…

springcloud第4季 远程调用openfegin的介绍4

一 openfegin的介绍 1.1 openfegin的介绍 openfegin是一个声明式的web客户端&#xff1b;只需要创建一个rest接口并在该接口上添加注解FeginClient即可。openfeign基本上就是当前微服务之间调用的事实标准。 openfeign同时还集成了sprigcloud loadbalance。

01-XML-01认识XML

XML 被设计出来用于数据的记录和传递&#xff0c;经常被作用为配置文件 什么是XML 可扩展标记语言&#xff08;Extensible Markup Language&#xff09;,没有固定的标签&#xff0c;所有的标签都可以自定义。使用简单的标记来描述数据通常&#xff0c;xml被用于信息的记录和传…

An Interview

What is your experience with Python and MySQL? Can you provide examples of projects you have worked on using these technologies? How would you handle customer requirements gathering and analysis? Can you provide an example of how you have translated cu…

C++—vector的介绍及使用 vector的模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

20240323-1-条件随机场面试题CRF

条件随机场面试题 1. 简单介绍条件随机场 条件随机场&#xff08;conditional random field&#xff0c;简称 CRF&#xff09;是给定一组输入随机变量条 件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场&#xff0c;是一种鉴…

【C语言】贪吃蛇【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏说明&#xff1a; 一个基于C语言链表开发的贪吃蛇游戏&#xff1a; 1. 按方向键上下左右&#xff0c;可以实现蛇移动方向的改变。 2. 短时间长按方向键上下左右其中之一&#xff0c;可实现蛇向该方向的短时间…

JQuery的attr()属性和JS的属性的方法

JQuery的attr属性&#xff1a; 我们先来看那一下JQuery的attr属性attr是一个jQuery方法&#xff0c;用于读取或设置HTML元素的属性值。它用于获取或设置HTML属性&#xff0c;例如src、href、title等。attr返回的值通常是属性的字符串表示。 $("标签名").attr("…

Unity 基于Rigidbody2D模块的角色移动

制作好站立和移动的动画后 控制器设计 站立 移动 角色移动代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class p1_c : MonoBehaviour {// 获取动画组件private Animator …

最短路径——Floyd算法、Dijkstra算法(未完...)

这里写目录标题 例题引入&#xff1a; 路径——蓝桥2021省赛题目分析题解&#xff01;&#xff01;&#xff01;求最短路径问题&#xff01;&#xff01;&#xff01;应用场景图的基础Floyd算法Acwing-843.有边数限制的最短路简单的思路讲解 Dijkstra算法 例题引入&#xff1a;…