js自定义水印

前言:今天在github上看到了一个定义水印的项目,因为获取的星星还蛮多,就多看了几眼,发现该项目简单有趣,心想以后可能会用的到,并且我下载到本地并亲自测试运行了一波。其实该项目最吸引我的是它定义js方法的方式(其实我看过很多项目都是这样定义js方法的,因为他们的项目太大,分析太过于复杂。这个项目让我有了一个切入点)。下面我就把该项目的分析过程与大家分享一下。

一:源码

因为对js,canvan不是太熟悉,故添加了注释已帮助理解和记忆

!function (root, factory) {      //  root=window    factory=方法(可以理解为工厂方法)
  if (typeof module === ‘object‘ && module.exports) {  // 其实是做的兼容处理(使用方式的兼容处理即js模块开发)
    module.exports = factory(root); // nodejs support
    module.exports[‘default‘] = module.exports; // es6 support
  }
  else
    root.alimask = factory(root);    //  我们用到的代码
}(typeof window !== ‘undefined‘ ? window : this, function () {
  var canvas, ctx;

  // merge the default value
  function mergeOptions(options) {  //合并默认参数和可选参数
    return Object.assign({
      width: 200,
      height: 70,
      color: ‘#ebebeb‘,
      alpha: 0.8,
      font: ‘50px Arial‘
    }, options);
  }
  return function(text, options) {
    if (!canvas || !ctx) {
      // if not exist, then initial
      if (typeof document !== ‘undefined‘) {
        canvas = document.createElement(‘canvas‘);
      } else {
        var Canvas = module.require(‘canvas‘);
        canvas = new Canvas();
      }
      ctx = canvas && canvas.getContext && canvas.getContext(‘2d‘);
      if (!canvas || !ctx) return ‘‘; // if not exist also, then return blank.
    }
    options = mergeOptions(options);
    var width = options.width,
      height = options.height;

    canvas.width = width;
    canvas.height = height;

    ctx.clearRect(0, 0, width, height); // clear the canvas
    ctx.globalAlpha = 0; // backgroud is alpha  

    // ctx.fillStyle = ‘white‘; // no need because of alipha = 0;
    ctx.fillRect(0, 0, width, height);

    ctx.globalAlpha= options.alpha; // text alpha 透明度
    ctx.fillStyle = options.color;
    ctx.font = options.font;

    ctx.textAlign = ‘left‘;
    ctx.textBaseline = ‘bottom‘;

    ctx.translate(width * 0.1, height * 0.9); // margin: 10
    ctx.rotate(-Math.PI / 12); // 15 degree   图片倾斜角度
    ctx.fillText(text, 0, 0);

    return canvas.toDataURL();  //生成图片URl
  };
});

二 :源码结构分析

源码的简化结构

!function (root, factory) {      //  root=window    factory=方法(可以理解为工厂方法)
  root.method //暴露的属性或方法(该js暴露是方法)                                                        *****通过root对象暴露全局    你可以理解为全局属性******
}(arg1, function () {  // 1.arg1=window()因为window是单例对象并暴露全局2.arg2=function()                 ******隐藏作用域即闭包       全局的子作用域(对对全局隐藏)*******
                                                              
  function f1(options) {  //该方法  做到可隐藏   即只读方法 (只能在该作用域或子作用域中访问到  该作用域对全局作用域隐藏)
  }

  return function(text, options) {  // 参数2                                                         ******提供对隐藏域的访问接口*******
      //调用方法f1
      f1();
      var obj = new **();
      return obj;
  }
});

分析:通过定义立即执行带参数的立即执行函数来隐藏方法(参数2)和方法f1

原理就是js闭包,相关文章可参考https://www.cnblogs.com/jinliang374003909/p/10352464.html

备注: 合并两个对象的属性方法

     Object.assign(obj1,obj2) //以obj1为主,当obj2中有相同的属性时,obj1的属性值被覆盖。当obj2中的属性obj1没有时,obj1添加该属性和值     利用该方法实现了,可选参数和默认参数的机制。   

参考地址:https://github.com/hustcc/alimask

原文地址:https://www.cnblogs.com/jinliang374003909/p/10601000.html

时间: 2024-10-09 20:29:20

js自定义水印的相关文章

在js自定义函数中使用$(event.target)代替$(this)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti

js自定义对象

<script type="text/javascript" src="out.js"></script> <script> /* *如果想要自定义对象,应该对对象进行描述*js是基于对象,不是面向对象.不具备描述事物的能力.*如果想按照面向对象的思想编写js.*就要先描述,在js中,可以用函数来模拟面对对象的中的描述*/ //用js来描述人/*function Person(){//相当于构造器alert("perso

Vue.js自定义指令的用法与实例

市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vue推崇数据驱动视图的理念,但并非所有情况都适合数据驱动.自定义指令就是一种有效的补充和扩展,不仅可用于定义任何的DOM操作,并且是可复用的. 比如谷歌图片的加载做得非常优雅,在图片未完成加载前,用随机的背景色占位,图片加载完成后才直接渲染出来.用自定义指令可以非常方便的实现这个功能. 效果: 自定义

原型设计模式prototype-构造js自定义对象

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 原型模式: prototype 原型属性 对象的原型拥有的属性,该对象的实例对象也会同时拥有 */ function Test(){ } T

与你相遇好幸运,Sails.js自定义responses

在 /api/responses/ 新建文件 >serviceDBError.js 自定义的数据库错误 >serviceError.js  自定义的数据错误 >serviceSuccess.js 自定义的数据成功信息 serviceSuccess.js内容示例: module.exports = function serviceSuccess (msg,result){ var res = this.res; res.status(200); res.json({ "statu

android之利用surfaceView实现自定义水印相机

知识点 1.自定义相机+预览相机 2.截屏拍照加水印 3.关于不使用intent来传输图片 俗话说,有图有真相.很多人都是喜欢直接看图,不像我,比较喜欢文字多点,经常看看散文什么的陶冶一下情操. 好了,说到这里,就引出我们今天要做的这个功能,那就是水印相机.水印相机说白了,就是在拍照的图片上面加上自己想要的各种信息,包括文字,图片或者其它你想要的信息. 在这里,我自己定义了一个类WaterCameraActivity,是自定义的相机的,然后还有一个类ViewPhoto,是用来查看你拍照后的图片的

Angular JS 自定义服务

Angular JS 自定义服务  定义服务的方式有如下几种: 1 变量方式(value Recipe)     2 工厂方式(factory Recipe)     3 服务方式(service Recipe)     4 供应者方式(provider Recipe)     5 常量方式(Constant Recipe)     6 特殊目的对象(Special Purpose Objects) 使用value来定义 var mainApp = angular.module("mainApp

漫谈js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义