代码地址如下:
http://www.demodashi.com/demo/11637.html

很久之前写过一篇关于 canvas 的文章,是通过 canvas 来实现一个绚丽的动画效果,不管看过没看过的小伙伴都可以直接猛戳下面的链接直达这篇文章哦!

因为之前很多篇都是偏向理论的,所以这次决定上点实际的内容——通过 canvas 为图片添加自定义水印,并且在文章末尾也会附上源码。下面进入正文~~~

添加水印的原理

原理很简单,主要分为下面几步

  1. 将需要添加水印的图片绘制到 canvas 上
  2. 将水印图片绘制到 canvas 上
  3. 将 canvas 的内容导出为图片

使用到的 canvas 的 api

// 获取当前 canvas 的上下文环境,用来操作在 canvas 上绘制内容
//
const ctx = canvas.getContext('2d') // 向 canvas 上绘制图片
// image 为一个图片对象
// x 为绘制图片的横向起始位置,y 为绘制图片的纵向起始位置
// width 为要绘制在 canvas 上宽度, height 为高度
// 该方法最多可接受 9 个参数,从而实现剪裁的效果,但是与本篇内容无关,感兴趣的小伙伴可以搜索该方法
ctx.drawImage(image, x, y, width, height) // 将 canvas 上的内容导出为 base64 格式的字符串,导出后可以直接赋值给 Image 对象的 src 属性
// 第一个参数为导出的图片格式,可接受第二个参数(小于或等于 1 的数,表示导出图片的压缩比率)
canvas.toDataURL("image/png")

其他要点

如果是通过链接获取的图片和水印,那么需要在绘制水印图片之前,先将两张素材图片加载完成,由于图片的加载时异步的,所以务必在确保图片已经成功加载后才可以开始添加水印

demo 最终的实现效果

可以看到每张图片的右下角都有一张小的水印图片

demo 中的添加水印的类可以单独使用,自定义的配置有如下几项:

  1. 水印图片路径
  2. 水印添加位置:目前支持 9 种位置,分别是 左上角 | 右上角 | 左下角 | 右下角 | 顶部水平居中 | 底部水平居中 | 左边垂直居中 | 右边垂直居中 | 水平垂直居中(默认位置)
  3. 水印位置与图片边缘的距离:默认 10px,在水平垂直居中时无效
  4. 水印与图片的宽度比:用来保证不管在多大的图片上都能达到相同的显示效果

该类可以同时为多张图片添加水印,但是只有当之前的多张图片全部完成添加后,才可以设置更多需要添加水印的图片

兼容性

该类使用 ES6 编写,且使用到了defineProperty()来监听状态的变动,所以不兼容 IE 的旧版浏览器,主流浏览器都可以使用

使用方式

具体的使用方式可以在 demo 的 watermark.js 中看到,源码中有完善的注释,整个方法加上注释只有 306 行,想要阅读源码的小伙伴也可以很轻松的读完

源码将在文章末尾贴出

使用过程中出现 bug 怎么办?

一旦出现 bug,请立即在文下评论,或者直接私信我都是没问题哒!因为这个 demo 是周二晚上写的,时间匆促,虽然已经极力避免出现问题,但如果真的出现了问题,还请各位小伙伴能够谅解。只要你指出,我一定尽快修复。当然如果你愿意自己动手修复 bug,那也是极好的!

如果你对源码有任何理解不了的地方,也欢迎你评论或者私信我哦!

如果你想添加文字水印或文字图片组合水印,也可以试着修改源码,通过 canvas 的绘制文字 api 来实现哦!

最后,关门放...

代码结构截图

代码文件截图

运行方式

下载后,需要将文件放到一个http 服务器中,然后启动http服务,来访问

访问如下图所示:

神奇的canvas——巧用 canvas 为图片添加水印

代码地址如下:
http://www.demodashi.com/demo/11637.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

神奇的canvas——巧用 canvas 为图片添加水印的更多相关文章

  1. Loading加载小插件,用户可以选择html格式或canvas格式,自定义loading图片,canvas色彩搭配可根据个人喜好

    ;(function($) { $.Loading = function(options) { //暴漏插件默认值 $.Loading.defaults = { speed: 200, //弹出层淡出 ...

  2. 将HTML5 Canvas的内容保存为图片借助toDataURL实现

    将HTML5 Canvas的内容保存为图片主要思想是借助Canvas自己的API - toDataURL()来实现,具体实现如下,感兴趣的朋友可以参考下哈,希望对你有所帮助 <html> ...

  3. Canvas DrawImage截取和压缩图片的陷阱

    html5的canvas十分之强大,可以做到快速的截取压缩出新的图片! 不过最近开发过程中遇到一个问题,图片压缩后使用toDataURL取得图片显示为一片漆黑,什么都没有! 折腾了很久,起初以为是上传 ...

  4. Canvas引入跨域的图片导致toDataURL()报错的问题的解决

    本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: [场景] 用户打开网页,则请求腾讯COS(图片服务器)上的图片js代码.使用canvas绘图. ...

  5. HTML5 Canvas 小例子 旋转的图片

    <一>CSS部分 @charset "utf-8"; *{ padding:; margin:; outline: none; } #canvas{ position: ...

  6. PHP《将画布(canvas)图像保存成本地图片的方法》

    用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...

  7. 使用canvas给图片添加水印

    css部分 .clip { position: absolute; clip: rect(0 0 0 0); } html部分 <input type="file" id=& ...

  8. 使用的是html5的canvas将文字转换成图片

    当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...

  9. 将canvas画布内容转化为图片(toDataURL(),创建url)

    将canvas画布内容转化为图片(toDataURL(),创建url) 总结 1.现在的浏览器都支持右键另存为图片的方法来将canvas画布内容转化为图片 2.在代码里面可以通过toDataURL() ...

随机推荐

  1. yii2中判断值是否存在二维数组中

    //在yii2中,在类里面的函数,可以不加action $arr = array( array('a', 'b'), array('c', 'd') ); in_array('a', $arr); / ...

  2. 大话PHP设计模式

    设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所 ...

  3. 洛谷——P1589 泥泞路

    P1589 泥泞路 题目描述 暴雨过后,FJ的农场到镇上的公路上有一些泥泞路,他有若干块长度为L的木板可以铺在这些泥泞路上,问他至少需要多少块木板,才能把所有的泥泞路覆盖住. 输入输出格式 输入格式: ...

  4. 浅谈单页应用和多页应用——Vue.js向

    浅谈单页应用和多页应用--Vue.js向 多页面 多页面应用:每次页面跳转,后台都会返回一个新的HTML文档,就是多页面应用. 在以往传统开发的应用(网站)大多都是多页面应用,路由由后端来写. 页面跳 ...

  5. Oracle的锁

    Oracle数据库中的锁机制 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数 ...

  6. [Contest20180122]超级绵羊异或

    题意:求$a\ xor\left(a+b\right)xor\cdots xor\left(a+b\left(n-1\right)\right)$ 对每一位求答案,第$k$的答案是$\sum\limi ...

  7. 6.4(java学习笔记)转换流

    一.乱码问题 我们来看下列例子: public class ConStream { //当前平台默认采用GBK public static void main(String[] args){ Stri ...

  8. SpringMVC(流程+第一个Demo)

    一.流程图 用户发送请求至前端控制器DispatcherServlet DispatcherServlet收到请求调用HandlerMapping处理器映射器. 处理器映射器根据请求url找到具体的处 ...

  9. 搭建SSH框架–使用篇

    创建如下包: action用于响应请求 service则是提供请求的操作 dao用于操作数据库 entity用于映射数据库表 打开DB Browser –> personalCD(创建篇的数据库 ...

  10. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之移动端开发随笔二

    前言 在前一篇文章中我已经做过开篇,接下来的随笔会详细讲一下我们的开发框架是如何实现的,专业的事由专业的人来讲,以后就由我们的高级码农小李英文名查尔斯和他的师父厂长(因为姓陈,酷爱摄影,我们的文艺片都 ...