canvas 实现全屏倾斜重复水印

article/2025/8/23 2:43:10

参考:

  1. html、js、canvas实现水印_html页面使用canvas绘制重复水印-CSDN博客

效果

​​​​在这里插入图片描述

不求水印显示完全。

实现代码


<template><div class="watermark" ref="waterMark"></div></template><script lang="ts">import { Component, Vue, Prop, Watch, Ref } from 'vue-property-decorator'@Component({name: 'WaterMark',components: {},})export default class WaterMark extends Vue {@Prop({ default: '' })private text!: string // 水印文本内容// 水印配置参数private config: any = {angle: -30, // 统一倾斜角度 [-90, 90]fontSize: 20, // 字体大小fontFamily: 'Arial, sans-serif', // 字体color: 'rgba(0, 0, 0, 0.5)', // '#cccccc', // 文字颜色opacity: 0.5, // 透明度zIndex: 999, // 层叠顺序gap: [200, 200], // 水印之间的间距[行,纵]}@Ref()private waterMark!: HTMLDivElement@Watch('text', { immediate: true })private onTextChange() {this.createWatermarks()}// 批量创建水印private createWatermarks() {this.addWatermark(this.text)}mounted() {// 确保页面加载完成后再创建水印this.$nextTick(() => {this.createWatermarks()})// 窗口变化时重新生成window.addEventListener('resize', this.createWatermarks)}private addWatermark(text: any) {if (!this.waterMark && !text) {return}const { fontSize, opacity, color, fontFamily, angle, gap } = this.configconst canvas: any = document.createElement('canvas')const ctx: any = canvas.getContext('2d')const width: any = window.innerWidthconst height: any = window.innerHeightlet nWidth = widthlet nHeight = heightif (angle) {// 根据角度计算宽高和原点移动const radian = (angle * Math.PI) / 180const sin = Math.sin(Math.abs(radian))const cos = Math.cos(Math.abs(radian))nWidth = width + height * sinnHeight = width * sin + height * coscanvas.width = nWidthcanvas.height = nHeightctx.translate(-height * sin * cos, height * sin * sin)ctx.rotate(radian)}ctx.globalAlpha = opacityctx.font = `${fontSize}px ${fontFamily}`ctx.fillStyle = color // 文字颜色和透明度ctx.textAlign = 'center'ctx.textBaseline = 'middle'// 在页面上重复绘制水印for (let x = 0, i = 0; x < nWidth; x += text.length * fontSize + gap[0]) {for (let y = 0; y < nHeight; y += gap[1]) {ctx.fillText(text, x + (i % 2) * (gap[0] / 2), y)i++}}const watermark = new Image()watermark.src = canvas.toDataURL('image/png')if (this.waterMark.style) {this.waterMark.style.backgroundImage = `url(${watermark.src})`this.waterMark.style.backgroundRepeat = 'repeat'}this.waterMark.dataset.watermark = 'true' // 标记水印元素}}</script><style lang="scss" scoped>.watermark {position: fixed;top: 0;left: 0;width: 100%;height: 100%;pointer-events: none;z-index: 9999;}</style>
计算旋转后的宽高和移动原点位置

蓝色长方形为原画布长宽,已知为 h,w(此处即为屏幕长宽)。

浅蓝色长方形为以A点为旋转中心,旋转x度之后的画布,

需要得到旋转之后能覆盖原画布大小的长宽-深蓝色长方形,即可求得:hsinX+w(长度没有很严格), hcosX+wsinX

旋转点也从 A点跑到了 B点:(- hsinXsinX, hsinXcosX)

在这里插入图片描述

公式补充

在这里插入图片描述
在这里插入图片描述

提示

如果要考虑文字都在可视区域,还需要考虑 textLefttextRight


const measureText = ctx.measureText(text)const textLeft = measureText.actualBoundingBoxLeftconst textRight = measureText.actualBoundingBoxRight

另外只要判断 xy 值在合理区间之内即可。


http://www.hkcw.cn/article/tZNnEXEgEe.shtml

相关文章

Android Studio 2022.2.1.20 汉化教程

查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下载&#xff1a;https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable

一根开价10万 年轻人迷上文玩玉米,风靡年轻圈

一根开价10万年轻人迷上文玩玉米。“文玩玉米风靡年轻圈,单根标价10万仍抢手!特殊培育的琥珀纹路、蜜蜡颗粒,经直播带货引爆市场,产业链从云南育种到百倍溢价,争议中见证新消费魔力。”文玩,这个曾被贴上“中老年专属”标签的传统爱好,如今正以意想不到的方式在年轻人中…

如何在Qt中绘制一个带有动画的弧形进度条?

如何在Qt中绘制一个弧形的进度条 在图形用户界面开发中&#xff0c;进度指示控件&#xff08;Progress Widget&#xff09;是非常常见且实用的组件。CCArcProgressWidget 是一个继承自 QWidget 的自定义控件&#xff0c;用于绘制圆弧形进度条。当然&#xff0c;笔者看了眼公开…

体育平台数据服务解决方案:从痛点到落地的全栈技术支持

一、体育平台开发的数据痛点解析 在体育平台开发领域&#xff0c;数据层建设往往成为技术团队的核心挑战&#xff1a; 实时数据获取难自建实时数据采集系统需解决赛事方反爬机制、多源数据同步&#xff08;如比分 / 球员位置 / 赔率&#xff09;、毫秒级延迟控制等问题&#…

去寺庙减脂的人胖了11斤 素食诱惑难抵挡

去寺庙减脂的人胖了11斤!一群原本希望通过吃减脂餐修身养性的打工人和中年人,在体验后第一批人竟胖了11斤,这反转实在惊人。当下生活节奏飞快,很多人被亚健康困扰,身体各种不适。于是大家开始注重养生,寺庙因宁静祥和且素食养生概念深入人心,被不少人视为减脂圣地。人们…

printf 输出格式总结(C语言)和C 中的类型提升规则、默认整型提升

类型格式符示例输出说明十进制整数%d12345输出有符号十进制&#xff08;int 类型&#xff09;十进制整数%u12345输出无符号十进制&#xff08;unsigned int&#xff09;十六进制%x3fa2小写十六进制&#xff08;无前缀&#xff09;十六进制%X3FA2大写十六进制&#xff08;无前缀…

Flutter下的一点实践

目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前&#xff0c;…

英国利物浦汽车冲撞人群事件嫌疑人身份公布

英国利物浦汽车冲撞人群事件嫌疑人身份公布 警方通报调查进展英国默西赛德郡警方发言人当地时间5月29日说,日前在利物浦市中心驾车冲撞球迷的男子面临7项指控,将于30日在利物浦地方法院出庭。据英国媒体报道,默西-柴郡地区皇家检察署授权默西赛德郡警方正式对53岁的嫌疑人保…

「动态规划::状压DP」网格图递推 / AcWing 292|327(C++)

目录 概述 相邻行递推 思路 算法过程 优化方案 空间优化 返回值优化 Code 复杂度 相邻两行递推 思路 算法过程 Code 复杂度 特殊优化&#xff1a;编译期计算 总结 概述 如果我们有一张地图&#xff0c;要求是在符合某类条件的前提在地图上放置最优解&#xff…

深圳海关查获超18公斤摇头丸 科技助力精准打击

近日,深圳邮局海关在跨境转运货物的监管过程中查获了一批伪报为“有机蜡溶香草”的包裹,实际上是摇头丸,总重量达18433.3克。目前,该案件已正式移交至海关缉私部门,进行更深入的调查和追溯。事件起因是海关关员对一批申报品名为“有机蜡溶香草”的转运货物进行例行检查时,…

一根网线连接两台电脑组建局域网

用一根网线分别插在网络端口&#xff0c;修改网络IP地址&#xff0c;假如有A和B&#xff0c;设置A:IP地址192.168.1.1,B&#xff1a;192.168.1.2 接着把网络防火墙关闭&#xff0c;步骤如下&#xff1a; 后面接着右键点击我的电脑&#xff0c;选择属性&#xff0c;打开远程控制…

丰巢回应快递柜消失市民取件扑空!

丰巢回应快递柜消失市民取件扑空。5月27日,上海普陀。市民发帖称包裹被存放在丰巢快递柜,过去取件时快递柜却消失不见了。5月29日,该包裹快递员告诉《正在新闻》,昨天在该小区的66号楼快递柜发生同样事件。对于快递柜搬走的原因,他表示不清楚,快递柜管理人员并没有告知他…

树型表查询方法 —— SQL递归

目录 引言&#xff1a; 自链接查询&#xff1a; 递归查询&#xff1a; 编写service接口实现&#xff1a; 引言&#xff1a; 看下图&#xff0c;这是 course_category 课程分类表的结构&#xff1a; 这张表是一个树型结构&#xff0c;通过父结点id将各元素组成一个树。 我…

高校大数据采集平台产品特色

大数据采集平台是专为高校大数据相关专业打造的智能化数据采集教学与实训工具。平台具有以下核心优势&#xff1a;采用可视化图形界面&#xff0c;无需编程基础&#xff0c;通过简单配置即可快速抓取网页中的文本、链接、图片、视频及文档等全类型数据&#xff0c;并自动存储至…

石家庄铁道大学回应书记打人 学生直播见证冲突

5月28日,石家庄铁道大学一名学生在宿舍里被学院书记殴打,还见了血。当时学生正在直播,许多网友目睹了整个过程。当这件事上了热搜后,学校的回应令人气愤,称学院书记没有问题,是学生先动手的。网友们表示不信,质疑书记去学生宿舍是为了让学生打他。事件起因是石家庄铁道大…

PGSQL结合linux cron定期执行vacuum_full_analyze命令

‌VACUUM FULL ANALYZE 详解‌ 一、核心功能 ‌空间回收与重组‌ 完全重写表数据文件&#xff0c;将碎片化的存储空间合并并返还操作系统&#xff08;普通 VACUUM 仅标记空间可重用&#xff09;。彻底清理死元组&#xff08;已删除或更新的旧数据行&#xff09;&#xff0c;解…

吴艳妮摘铜哽咽鞠躬道歉 带伤参赛展现坚韧精神

5月29日,亚洲田径锦标赛女子100米栏决赛中,吴艳妮以13秒07的成绩获得铜牌。赛后,她走路时显得有些一瘸一拐。在接受采访时,吴艳妮哽咽着向大家道歉,表示很感谢现场观众的支持,但没能为中国队拿到冠军感到非常抱歉。她提到自己的伤还没有完全恢复,不想过多解释,但仍坚信…

XCVP1902-2MSEVSVA6865 Xilinx FPGA Versal Premium SoC/ASIC

XCVP1902-2MSEVSVA6865 Versal Premium SoC/ASIC 单片 FPGA&#xff0c;可提供大容量 FPGA 逻辑仿真和原型设计目标。VP1902的逻辑单元数量增加了 2.2 倍&#xff0c;达到 1850 万个。 VP1902 自适应 SoC 提供最大容量和连接能力&#xff0c;具有可随机存取的逻辑密度和 2.4 倍…

TripGenie:畅游济南旅行规划助手:个人工作纪实(二十一)

这次&#xff0c;我新增了一个济南公交线路的展示界面&#xff0c;济南的公交线路多&#xff0c;且经过的站点覆盖范围广&#xff0c;价格实惠&#xff0c;是出行旅游交通工具的不二之选&#xff0c;我基于此现实情况&#xff0c;觉得做一个新的页面全面展示济南交通。 我选择把…

激励电平与频差的微妙平衡:晶振选型不可忽视的细节

在电子设备的设计中&#xff0c;晶振作为提供稳定时钟信号的关键元件&#xff0c;其选型的正确性直接关系到整个系统的性能与稳定性。而在晶振选型过程中&#xff0c;激励电平与频差之间的微妙平衡常常被工程师们所忽视&#xff0c;然而这一细节却可能对电路的正常运行产生深远…