canvas给图片与文本加水印

server/2024/12/16 10:53:46/
htmledit_views">

先弄出一个canvas

html"><!DOCTYPE html>
<html>
<head>
<title>Canvas API 示例</title>
</head>
<body>
<canvas id="myCanvas" width="200" height="200" style="border:1px solid #000000;">您的浏览器不支持Canvas。
</canvas>
<script type="text/html" title=javascript>javascript">var canvas = document.getElementById("myCanvas");var ctx = canvas.getContext("2d");ctx.fillStyle = "#ff0000";ctx.beginPath();ctx.arc(100, 100, 70, 0, Math.PI * 2, true);ctx.closePath();ctx.fill();
</script>
</body>
</html>

在开始创建文本水印之前,我们需要先搭建Canvas环境并获取其上下文(context)。Canvas API提供了2D渲染上下文,我们可以通过它来绘制文本、图形等元素。以下是如何设置Canvas环境和获取上下文的步骤:

html" title=javascript>javascript">// 获取Canvas元素
const canvas = document.getElementById('myCanvas');// 获取Canvas的2D渲染上下文
const ctx = canvas.getContext('2d');// 设置Canvas尺寸
canvas.width = window.innerWidth; // 适应窗口宽度
canvas.height = window.innerHeight; // 适应窗口高度

接下来,我们将进行文本水印的参数配置和渲染流程。文本水印涉及到的参数主要包括文本内容、字体样式、字体大小、颜色以及文本的位置等。

html" title=javascript>javascript">// 设置文本水印参数
const text = "水印文本"; // 文本内容
const font = "20px Arial"; // 字体样式和大小
const color = "rgba(0, 0, 255, 0.5)"; // 颜色(带透明度)
const textX = 10; // 文本的X坐标
const textY = 30; // 文本的Y坐标// 渲染文本水印
ctx.font = font; // 设置字体
ctx.fillStyle = color; // 设置填充颜色
ctx.fillText(text, textX, textY); // 绘制文本

设计文本水印时,字体、大小和颜色是三个至关重要的参数。通过调整这些参数,我们能够控制文本水印的外观和可读性,以便更好地符合设计需求。

html" title=javascript>javascript">// 设置不同的字体、大小和颜色
const fonts = ['Arial', 'Times New Roman', 'Consolas', 'Courier New'];
const sizes = ['16px', '20px', '24px', '28px'];
const colors = ['rgba(0, 0, 0, 0.5)','rgba(255, 0, 0, 0.5)','rgba(0, 255, 0, 0.5)','rgba(0, 0, 255, 0.5)'
];// 随机选择字体样式、大小和颜色
let randomFont = fonts[Math.floor(Math.random() * fonts.length)];
let randomSize = sizes[Math.floor(Math.random() * sizes.length)];
let randomColor = colors[Math.floor(Math.random() * colors.length)];// 渲染文本水印
ctx.font = `${randomSize} ${randomFont}`; // 设置随机字体和大小
ctx.fillStyle = randomColor; // 设置随机颜色
ctx.fillText(text, textX, textY);

除了字体、大小和颜色,文本布局和对齐方式也是设计文本水印时需要考虑的因素。它们直接影响到文本的展示效果和阅读体验。

html" title=javascript>javascript">// 设置文本的对齐方式
ctx.textAlign = 'center'; // 水平居中对齐
ctx.textBaseline = 'middle'; // 垂直居中对齐// 渲染文本水印
ctx.fillText(text, canvas.width / 2, canvas.height / 2); // 在Canvas中心位置绘制文本

在某些情况下,我们可能需要处理文本内容过长导致的换行和溢出问题。通过调整Canvas的文本绘制方法,我们可以实现文本的自动换行,并通过设置裁剪区域来处理溢出。

html" title=javascript>javascript">// 设置文本换行
ctx.textAlign = 'start'; // 文本左对齐
ctx.textBaseline = 'top'; // 文本顶部对齐
ctx.direction = 'rtl'; // 文本方向从右到左// 设置裁剪区域,防止文本溢出Canvas边界
ctx.canvas.width = 300; // 设置Canvas宽度
ctx.canvas.height = 200; // 设置Canvas高度
ctx.clip(); // 应用裁剪区域// 渲染文本水印
const longText = "这是一段很长很长的文本,可能会导致换行,我们需要正确处理这种情况,确保文本能够在Canvas中正确显示。";
ctx.fillText(longText, 10, 10);

由于图片资源通常较大,若在页面加载时同步加载所有图片,将导致页面渲染时间过长,用户体验差。因此,采用异步加载是解决这一问题的有效方法。使用 Image 对象的 onload 事件可以监控图片加载状态。

 

html" title=javascript>javascript">var img = new Image();
img.onload = function() {console.log('图片加载完成');// 绘制图片水印的代码可以在这里执行
};
img.onerror = function() {console.log('图片加载失败');
};
img.src = 'path/to/your/image.png'; // 异步加载图片

在复杂的Web应用中,合理管理图片资源的缓存策略是提高性能的关键。合理使用浏览器缓存可以减少服务器请求次数,加快页面加载速度。设置合理的HTTP缓存头(例如 Cache-Control )是一个有效的方法。

html" title=javascript>javascript">function preloadImages(imagesArray) {var loadedImages = [];var imagesToLoad = imagesArray.length;imagesArray.forEach(function(imageUrl) {var img = new Image();img.onload = function() {loadedImages.push(img);imagesToLoad--;if (imagesToLoad === 0) {// 所有图片加载完成console.log('所有图片加载完毕');}};img.onerror = function() {console.log('图片加载错误');};img.src = imageUrl;});
}

 在Canvas中绘制图片水印首先需要确定图片的坐标位置和尺寸。通常,我们希望水印覆盖整个画布,或者在特定位置显示。下面是一个设置图片水印坐标的示例代码:

html" title=javascript>javascript">function drawImageWatermark(ctx, img, x, y, width, height) {// 保持图片纵横比var imgRatio = img.width / img.height;var canvasRatio = ctx.canvas.width / ctx.canvas.height;if (canvasRatio < imgRatio) {width = ctx.canvas.width; // 宽度设置为画布宽度height = width / imgRatio; // 高度按比例缩放} else {height = ctx.canvas.height; // 高度设置为画布高度width = height * imgRatio; // 宽度按比例缩放}// 绘制图片ctx.drawImage(img, x, y, width, height);
}

 图片水印通常需要一定透明度以避免完全覆盖底下的内容。另外,不同的Canvas合成模式可以帮助我们创建独特的视觉效果。下面是如何设置图片水印透明度和使用合成模式的代码示例:

html" title=javascript>javascript">function applyWatermark(ctx, img) {// 设置透明度ctx.globalAlpha = 0.5;// 设置混合模式,这里用的是destination-atop,确保水印在内容之上但不是完全覆盖ctx.globalCompositeOperation = 'destination-atop';// 绘制图片水印ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height);// 清除设置,不影响后续绘制ctx.globalAlpha = 1;ctx.globalCompositeOperation = 'source-over';
}

 


http://www.ppmy.cn/server/150612.html

相关文章

Python-pptx库简介

目录 一、Python-pptx 库概述 二、安装 Python-pptx 库 三、创建演示文稿 四、添加文本内容 五、添加形状 六、添加图片 七、添加图表 八、保存演示文稿 九、示例演示文稿 十、总结 在Python编程中&#xff0c;处理演示文稿是一项常见的任务。Python-pptx库为我们提供…

idea启动时报错“类文件具有错误版本61.0,应为55.0”

启动Springcloud项目时&#xff0c;idea启动时报错“类文件具有错误版本61.0&#xff0c;应为55.0”。 jdk版本和spring版本不匹配&#xff0c; 网上通常的解决方案是降低spring版本&#xff0c;需要在pom.xml文件里修改一下依赖的spring版本。 我不想降低,安装jdk17后还需要…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步&#xff0c;探索运动方程&#xff0c;了解真实世界中的物理&#xff0c;并调整它们&#xff0c;以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟&#xff0c;而是找到最有趣…

RCE 命令注入 过滤cat绕过方式

过滤cat 查看当前目录 根据题目可以知道cat被过滤了&#xff0c;并不能简单的得到flag 使用单引号绕过 127.0.0.1|cat flag_1429188548629.php 使用双引号绕过 127.0.0.1|c""at flag_1429188548629.php 利用Shell 特殊变量绕过 127.0.0.1|c$at flag_14291885…

黑马 Cpp qt相关笔记

什么是QT QT是一个跨平台的C图像用户界面应用程序框架QT在1991年由奇趣科技开发QT的优点 跨平台,几乎支持所有平台接口简单&#xff0c;容易上手一定程度上简化了内存回收机制有很好的社区氛围可以进行嵌入式开发 QWidget QT注意事项 命名规范 类名 首字母大写&#xff0c;单…

7-3 最大子段和问题

分数 30 作者 王东 单位 贵州师范学院 最大子段和问题。给定由n个整数组成的序列&#xff0c;求序列中子段的最大和&#xff0c;若所有整数均为负整数时定义最大子段和为0。 输入格式: 第一行输入整数个数n&#xff08;1≤n≤1000&#xff09;&#xff0c;再依…

在 Windows11 上安装k8s的包管理工具Helm

Helm 先简单介绍一下&#xff0c;Helm 是一个用于管理 Kubernetes 应用程序的包管理工具&#xff0c;它帮助用户简化 Kubernetes 应用的安装、配置和管理。可以将 Helm 看作是 Kubernetes 的包管理器&#xff0c;类似于 Linux 上的 apt 或 yum&#xff0c;它能够帮助用户轻松部…