JS利用Canvas实现文字水印和图片水印合成
作者:zkj 发布时间:2024-07-29 19:40:08
介绍
给图片添加水印可以帮助网站或作者保护自己的版权,或防止内容被别人利用。给图片添加水印分为添加文字水印和添加图片水印,水印一般都做成半透明的,这样不至于影响原图内容的浏览。Canvas 图片水印合成与 Canvas 实现图片压缩 原理基本相同:
CanvasRenderingContext2D.drawImage(image, dx, dy, dWidth, dHeight) 方法可以从页面 DOM 元素作为图像源来根据坐标和大小重新绘制该图像。
HTMLCanvasElement.toDataURL() 方法支持导出为 base64 字符串。
文字水印
首先创建一个空的 canvas 元素,并获取其上下文。
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
获取页面上需要合成水印的 img 元素,或者根据一个 File 或 Blob 对象,创建一个空的 img 元素,将其 src 设为 File 或 Blob 对象的 URL。
设置 canvas 元素的宽高为 img 元素的宽高,清除画布,绘制图像。
canvas.width = img.width;
canvas.height = img.height;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
设置字体、对齐方式、旋转角度。
ctx.font = `bold ${img.height / 10}px arial`;
ctx.fillStyle = 'rgba(255, 0, 0, .2)';
ctx.textBaseline = 'bottom';
ctx.transform(1, 0.5, -0.5, 1, 0, -canvas.height / 2);
定义水印文字、水印高度,循环绘制水印。
let txt = '1234567 ';
const txtHeight = img.height / 6;
txt = Array(Math.ceil(canvas.width / ctx.measureText(txt).width) * 2).join(txt);
for (let i = 0; i < Math.ceil(canvas.height / txtHeight) * 2; i++) {
ctx.fillText(txt, 0, i * txtHeight);
}
在页面渲染合成后的图像,释放创建的 URL 对象。
result.src = canvas.toDataURL(type);
URL.revokeObjectURL(img.src);
效果
图片水印
首先创建一个空的 canvas 元素,并获取其上下文。
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
获取页面上需要合成水印的 img 元素,或者根据一个 File 或 Blob 对象,创建一个空的 img 元素,将其 src 设为 File 或 Blob 对象的 URL。
设置 canvas 元素的宽高为 img 元素的宽高,清除画布,绘制图像。
canvas.width = img.width;
canvas.height = img.height;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
设置旋转角度,创建重复图像的模式,绘制水印。
ctx.transform(1, 0.5, -0.5, 1, 0, -canvas.height / 2);
ctx.rect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = ctx.createPattern(imgCover, 'repeat');
ctx.fill();
在页面渲染合成后的图像,释放创建的 URL 对象。
result.src = canvas.toDataURL(type);
URL.revokeObjectURL(img.src);
效果
来源:https://juejin.cn/post/7167364161461026852


猜你喜欢
- 直接看下面例子my_ld = [lambda x:x*i for i in range(3)]my_list = [ld(2) for ld
- 写在前面 众所周知python拥有众多的第三方库,据不完全统计python有1w多个第三方库(为什么是不完全统计,因为我也记不清了☺),
- 学习前言上一篇讲了如何构建回归算法,这一次将怎么进行简单分类。Keras中分类的重要函数1、np_utils.to_categoricaln
- 小编曾经有过这样的经历,就是在安装使用django框架时候,遇到了部分模块不能够使用,检查了很久,才发现是因为版本问题,需要重新编译安装一个
- 这篇文章主要介绍了Django rstful登陆认证并检查session是否过期代码实例,下面我们可以来一起学习一下。一:restful用户
- python 字符串下标与切片的实例代码,如下:# !/usr/bin/env pythonname = "ksunone&quo
- 简介观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个
- 本文实例讲述了python使用wxpython开发简单记事本的方法。分享给大家供大家参考。具体分析如下:wxPython是Python编程语
- 我们直接先给出输出与预期不同的代码In[28]: a = [1,2,3,4,5,6]In[29]: for i in a: ...: &nb
- ubuntu 系统自带的 python 有多个版本,使用时难免会遇到环境变量出错,特别是当自动化运行脚本的时候。特别是近一个月来,实验室的小
- 本文意在弄清楚这些概念间的关系及其作用。弄清Mysql在开启事务的情况下,每条sql执行时的加锁操作和MVCC版本控制。为使讨论简单,本文忽
- 本文实例讲述了Python编程中event对象的用法。分享给大家供大家参考,具体如下:Python提供了Event对象用于线程间通信,它是由
- 一、使用的工具haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh,*Xapian*搜
- replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。语法:string.replace(sub
- 一.图像漫水填充图像漫水填充(FloodFill)是指用一种特定的颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效
- 文章背景:某天,我的一个同事给我看了CSDN上面的一篇关于编程语言排行榜的文章,里面我看到VB还是排名很不错的,我就说,asp(vbscri
- 因为项目开发中遇到需要向后台传本周的开始和结束时间,以及上一周的起止时间,就琢磨了半天,总算写出来一套,写篇文章是为了方便自己记忆,也是分享
- 一、前言前两篇博客讲解了爬虫解析网页数据的两种常用方法,re正则表达解析和beautifulsoup标签解析,所以今天的博客将围绕另外一种数
- 点云生成 3D 网格的最快方法已经用 Python 编写了几个实现来从点云中获取网格。它们中的大多数
- 目录1.数组重塑1.1 一维数组重塑1.2 多维数组重塑2.数组转置1.数组重塑所谓数组重塑就是更改数组的形状。比如将原来3行4列的数组重塑