当前位置: 首页 > news >正文

JavaScript和小程序写水印的方法示例

主要JavaScript方法:Canvas

文档地址:

绘制文本 - Web API | MDN在前一个章节中看过如何应用样式和颜色之后,我们现在来看一下如何在画布(canvas)中绘制文本。https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_text

说一下目前主流的两种实现方式:

1.使用for循环将文字依次填充到不同的坐标位置

html代码示例:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Canvas Text Water Mask Example</title>
</head><body><canvas id="myCanvas"></canvas><script>drawWaterMask()function getDPR() {const dpr = devicePixelRatio || 1;return dpr;}function drawWaterMask() {const dpr = getDPR()const canvas = document.getElementById('myCanvas');const pageWidth = document.documentElement.clientWidthconst pageHeight = document.documentElement.clientHeightconst ctx = canvas.getContext('2d');// 提升水印清晰度,消除锯齿---start----canvas.width = pageWidth * dpr;canvas.height = pageHeight * dpr;canvas.style.width = pageWidth * dpr + 'px';canvas.style.height = pageHeight * dpr + 'px';ctx.scale(dpr, dpr); // 缩放绘图上下文,提升水印清晰度// 提升水印清晰度,消除锯齿---end----const FOR_NUM = 10const MAX_TEXT_Y = 200const OPACITY_NUM = 0.5 // 水印文字透明度ctx.rotate(45 * Math.PI / 180);//设置文字的旋转角度;const text = ('张三 2025-07-29 00:00:00'); // 在(x, y)位置写文字//对斜对角线以左部分进行文字的填充(两个for循环的配合,使得文字充满斜对角线的左下部分)for (let j = 1; j < FOR_NUM; j++) { //用for循环达到重复输出文字的效果,这个for循环代表纵向循环ctx.beginPath();ctx.font = `bold 12px Arial`;ctx.fillStyle = `rgba(169,169,169,${OPACITY_NUM})`;ctx.fillText(text, 0, MAX_TEXT_Y / 2 * j);for (let i = 1; i < FOR_NUM; i++) {//这个for循环代表横向循环,ctx.beginPath();ctx.font = `bold 12px Arial`;ctx.fillStyle = `rgba(169,169,169,${OPACITY_NUM})`;ctx.fillText(text, MAX_TEXT_Y * i, MAX_TEXT_Y / 2 * j);}}//对斜对角线以右部分进行文字的填充逻辑同上for (let j = 0; j < FOR_NUM; j++) {ctx.beginPath();ctx.font = `bold 12px Arial`;ctx.fillStyle = (`rgba(169,169,169,${OPACITY_NUM})`);ctx.fillText(text, 0, -MAX_TEXT_Y / 2 * j);for (let i = 1; i < FOR_NUM; i++) {ctx.beginPath();ctx.font = `bold 12px Arial`;ctx.fillStyle = `rgba(169,169,169,${OPACITY_NUM})`;ctx.fillText(text, MAX_TEXT_Y * i, -MAX_TEXT_Y / 2 * j);}}}</script>
</body></html>

小程序代码示例:

在wxml文件写下

<canvas canvas-id='myCanvas1' style='width:100%;height:100vh;'></canvas>

具体方法如下: 

drawWaterMask (text) {if(!text) {return}var ctx = wx.createCanvasContext("myCanvas1");ctx.rotate(45 * Math.PI / 180);//设置文字的旋转角度;const FONT_SIZE = 12const FOR_NUM = 10const MAX_TEXT_Y = 200const OPACITY_NUM = 0.5//对斜对角线以左部分进行文字的填充for (let j = 1; j < FOR_NUM; j++) { ctx.beginPath();ctx.setFontSize(FONT_SIZE);ctx.setFillStyle(`rgba(169,169,169,${OPACITY_NUM})`);ctx.fillText(text, 0, MAX_TEXT_Y/2 * j);for (let i = 1; i < FOR_NUM; i++) {ctx.beginPath();ctx.setFontSize(FONT_SIZE);ctx.setFillStyle(`rgba(169,169,169,${OPACITY_NUM})`);ctx.fillText(text, MAX_TEXT_Y * i, MAX_TEXT_Y/2 * j);}}for (let j = 0; j < FOR_NUM; j++) {ctx.beginPath();ctx.setFontSize(FONT_SIZE);ctx.setFillStyle(`rgba(169,169,169,${OPACITY_NUM})`);ctx.fillText(text, 0, -MAX_TEXT_Y/2 * j);for (let i = 1; i < FOR_NUM; i++) {ctx.beginPath();ctx.setFontSize(FONT_SIZE);ctx.setFillStyle(`rgba(169,169,169,${OPACITY_NUM})`);ctx.fillText(text, MAX_TEXT_Y * i, -MAX_TEXT_Y/2 * j);}}ctx.draw();}

然后在onLoad和onPullDownRefresh生命周期下使用

this.drawWaterMask('具体文案')

注意:把按钮等的层级写高一点,以免被水印遮挡,点击不了 

2.先填充一个文字,输出图片,作为页面的background,再利用background的repeat属性

html代码示例:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Canvas Text Water Mask Example</title>
</head><body><canvas id="myCanvas" width="200" height="200" style="width:200px;height: 200px;display: none;"></canvas><div id="outputImage" style="width:100%;height: 100vh;"></div><script>const canvas = document.getElementById('myCanvas');const ctx = canvas.getContext('2d');const FONT_SIZE = 16const MAX_TEXT_X = 10const MAX_TEXT_Y = 10const OPACITY_NUM = 0.5ctx.rotate(45 * Math.PI / 180);//设置文字的旋转角度;const text = ('张三 2025-07-29 00:00:00');ctx.fontSize = `${FONT_SIZE}px`;ctx.fillStyle = (`rgba(169,169,169,${OPACITY_NUM})`);// 在(X, Y)位置写文字ctx.fillText(text, MAX_TEXT_X, MAX_TEXT_Y);// 当背景图片图片填充,巧用repeat属性就不用循环多次写水印文字了const imageUrl = canvas.toDataURL('image/png'); // 可以选择'image/jpeg'等其他格式document.getElementById('outputImage').style.background = `url(${imageUrl}) repeat`;document.getElementById('outputImage').style.backgroundSize = '40%';document.getElementById('outputImage').style.backgroundPosition = 'left top';</script>
</body></html>

http://www.dtcms.com/a/305813.html

相关文章:

  • github-idea新建文件就要弹窗提醒-如何关闭-2025.7.30
  • RustDesk 使用教程
  • 【C#】DevExpress.XtraEditors.MemoEdit memoEditLog控件讲解
  • Linux的小程序——进度条
  • 相亲小程序匹配与推荐系统模块搭建
  • 元码智能“大眼睛”机器人首发,智启生活新纪元!
  • Netty的Http解码器源码分析
  • Tdesign-React 模板面包屑如何放到 Header头部
  • 深度学习:预训练和warm up的区别
  • React 开发中遇见的低级错误
  • 线性代数常见的解题方法
  • JS中defineProperty/Proxy 数据劫持 vue3/vue2双向绑定实现原理,react 实现原理
  • 在 React + Ant Design 项目中实现文字渐变色
  • 技术速递|GitHub Copilot 的 Agent 模式现已全面上线 JetBrains、Eclipse 和 Xcode!
  • 国产化再进一步,杰和科技推出搭载国产芯片的主板
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(5)
  • JavaScript数据类型
  • 高密度客流特征识别误差↓76%!陌讯多模态轻量化算法实战解析
  • Linux初始及常见指令使用
  • Redis学习------缓存雪崩
  • 解决Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required报错问题
  • 视频生成模型蒸馏的方法
  • Orange的运维学习日记--19.Linux文件归档和备份
  • 15.10 单机8卡到千卡集群!DeepSpeed实战调参手册:A100训练效率翻倍,百万成本优化实录
  • 南水北调东线工程图件 shp数据
  • 三目云台全景监控画面实现三个画面联动
  • 【图像处理】直方图均衡化c++实现
  • python基础语法2,程序控制语句(简单易上手的python语法教学)(课后练习题)
  • Python3与MySQL的PyMySQL连接与应用
  • 【Spring Boot 快速入门】四、MyBatis