亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript轉換靜態圖片,增加粒子動畫效果

2019-11-20 12:24:03
字體:
來源:轉載
供稿:網友

使用getImageData接口獲取圖片的像素點,然后基于像素點實現動畫效果,封裝成一個簡單的lib

<!DOCTYPE html><html>  <head>    <title>particle image</title>    <meta charset="utf-8" />    <style>      #logo {        margin-left:20px;        margin-top:20px;        width:160px;        height:48px;        background:url('./images/logo.png');        /*border: 1px solid red;*/      }    </style>    <script type="text/javascript" src="ParticleImage.js"></script>    <script>      window.onload = function() {        ParticleImage.create("logo", "./images/logo.png", "fast");      };    </script>  </head>  <body>    <div id="logo"></div>  </body></html>

ParticleImage.js

/*The MIT License (MIT) Copyright (c) 2015 arest Permission is hereby granted, free of charge, to any person obtaining a copy ofthis software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ /** * Add particle animation for image * usage:    <script type="text/javascript" src="ParticleImage.js"></script>    <script>      window.onload = function() {        // be sure to use image file in your own server (prevent CORS issue)        ParticleImage.create("logo", "logo_s2.png", "fast");      };    </script>    // in html file    <div id="logo"></div>    // you can set default background image as usual    #logo {      margin-left:20px;      margin-top:20px;      width:160px;      height:48px;      background:url('logo_s2.png');    } * * @author tianx.qin (rushi_wowen@163.com) * @file ParticleImage.js * @version 0.9 */var ParticleImage = (function(window) {  var container = null, canvas = null;  var ctx = null, _spirit = [], timer = null,    cw = 0, ch = 0, // container width/height    iw = 0, ih = 0, // image width/height    mx = 0, my = 0, // mouse position    bMove = true,    MOVE_SPAN = 4, DEFAULT_ALPHA = 100,    speed = 100, S = {"fast":10, "mid":100, "low":300},    ALPHA = 255 * 255;   // spirit class  var Spirit = function(data) {    this.orginal = {      pos: data.pos,      x : data.x, y : data.y,      r : data.r, g : data.g, b : data.b, a : data.a    };    // change state, for animation    this.current = {      x : data.x,      y : data.y,      a : data.a    };  };   /**   * move spirit to original position   */  Spirit.prototype.move = function() {    var cur = this.current, orig = this.orginal;    if ((cur.x === orig.x) && (cur.y === orig.y)) {      //console.log("don't move:" + cur.y);      return false;    }    //console.log("move:" + cur.y);    var rand = 1 + Math.round(MOVE_SPAN * Math.random());    var offsetX = cur.x - orig.x,      offsetY = cur.y - orig.y;    var rad = offsetX == 0 ? 0 : offsetY / offsetX;    var xSpan = cur.x < orig.x ? rand : cur.x > orig.x ? -rand : 0;    cur.x += xSpan;    var tempY = xSpan == 0 ? Math.abs(rand) : Math.abs(Math.round(rad * xSpan));    var ySpan = offsetY < 0 ? tempY : offsetY > 0 ? -tempY : 0;    cur.y += ySpan;    cur.a = ((cur.x === orig.x) && (cur.y === orig.y)) ? orig.a : DEFAULT_ALPHA;    return true;  };   /**   * set random position   */  Spirit.prototype.random = function(width, height) {    var cur = this.current;    cur.x = width + Math.round(width * 2 * Math.random());    this.current.y = height + Math.round(height * 2 * Math.random());  };   /**   * set random positions for all spirits   */  var _disorder = function() {    var len = _spirit.length;    for (var i = 0; i < len; i++) {      _spirit[i].random(cw, ch);    }  };   /**   * start to move spirit   */  var _move = function() {    var sprt = _spirit;    var len = sprt.length;    var isMove = false; // whether need to move    for (var i = 0; i < len; i++) {      if (sprt[i].move()) {        isMove = true;      }    }    isMove ? _redraw() : _stopTimer();  };   /**   * redraw all spirits while animating   */  var _redraw = function() {    var imgDataObj = ctx.createImageData(iw, ih);    var imgData = imgDataObj.data;    var sprt = _spirit;    var len = sprt.length;    //console.log("redraw image : " + len);    for (var i = 0; i < len; i++) {      var temp = sprt[i];      //console.log("item : " + JSON.stringify(temp));      var orig = temp.orginal;      var cur = temp.current;      var pos = (cur.y * iw + cur.x) * 4;      imgData[pos] = orig.r;      imgData[pos + 1] = orig.g;      imgData[pos + 2] = orig.b;      imgData[pos + 3] = cur.a;    }    ctx.putImageData(imgDataObj, 0, 0);  };   /**   * add mousemove/mouseclick event   */  var _addMouseEvent = function(c) {    c.addEventListener("mouseenter", function(e) {      //console.log("e.y:" + e.clientY + ", " + container.offsetTop);      _startTimer();    });    c.addEventListener("click", function() {      // disorder all spirits and start animation      _startTimer();    });  };   /**   * calculate all pixels of the logo image   */  var _checkImage = function(imgUrl, callback) {    // var tempCanvas = document.getElementById("temp");    //canvas.width = width;    //canvas.height = height;     var proc = function(image) {      var w = image.width, h = image.height;      iw = w, ih = h;      //console.log("proc image " + image + "," + w + "," + h);      canvas = _createCanvas();      // hide container background      container.style.backgroundPosition = (-w) + "px";      container.style.backgroundRepeat = "no-repeat";      ctx.drawImage(image, 0, 0);      // this may cause security error for CORS issue      try {        var imgData = ctx.getImageData(0, 0, w, h);        var arrData = imgData.data;        for (var i = 0; i < arrData.length; i += 4) {          var r = arrData[i], g = arrData[i + 1], b = arrData[i + 2], a = arrData[i + 3];          if (r > 0 || g > 0 || b > 0 || a > 0) {            var pos = i / 4;            _spirit.push(new Spirit({              x : pos % w, y : Math.floor(pos / w),               r : r, g : g, b : b, a : a            }));          }        }        return true;      } catch (e) {        // do nothing        return false;      }      //return out;    };     var img = new Image();    img.src = imgUrl;    if (img.complete || img.complete === undefined) {      proc(img) && callback && callback();    } else {      img.onload = function() {        proc(img) && callback && callback();      };    }  };   // use "requestAnimationFrame" to create a timer, need browser support  var _timer = function(func, dur) {    //console.log("speed is " + dur);    var timeLast = null;    var bStop = false;    var bRunning = false; // prevent running more than once    var _start = function() {      if (func) {        if (! timeLast) {          timeLast = Date.now();          func();        } else {          var current = Date.now();          if (current - timeLast >= dur) {            timeLast = current;            func();          }        }      }       if (bStop) {        return;      }      requestAnimationFrame(_start);    };     var _stop = function() {      bStop = true;    };     return {      start : function() {        if (bRunning) {          //console.log("already running..");          return;        }        //console.log("start running..");        bRunning = true;        bStop = false;        _disorder();        _start();      },      stop : function() {        _stop();        bRunning = false;      }    };  };   var _startTimer = function() {    if (! timer) {      timer = _timer(function() {        bMove && _move();      }, speed);    }    timer.start();  };   var _stopTimer = function() {    timer && timer.stop();  };   /**   * start process   */  var _create = function(imgUrl) {    _checkImage(imgUrl, function() {      //_createSpirits();      _addMouseEvent(canvas);      //_startTimer();    });  };   var _setSpeed = function(s) {    S[s] && (speed = S[s]);  };   /**   * check whether browser supports canvas   */  var _support = function() {    try {      document.createElement("canvas").getContext("2d");      return true;    } catch (e) {      return false;    }  };   /**   * create a canvas element   */  var _createCanvas = function() {    var cav = document.createElement("canvas");    cav.width = iw;    cav.height = ih;    container.appendChild(cav);    ctx = cav.getContext("2d");    return cav;  };   /**   * initialize container params   */  var _init = function(c, s) {    if ((! c) || (! _support())) { // DIV id doesn't exist      return false;    }    container = c;    cw = c.clientWidth;    ch = c.clientHeight;    s && _setSpeed(s);    return true;  };   /**   * export   */  return {    "create" : function(cId, imgUrl, s) { // user can set move speed by 's'['fast','mid','low']      _init(document.getElementById(cId), s) && _create(imgUrl);    }  };})(window);

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费成人精品视频| 91精品国产91久久久久| 亚洲欧美日韩中文在线| 精品中文字幕久久久久久| 国产精品白嫩美女在线观看| 国产欧美日韩中文字幕在线| 精品亚洲国产视频| 国产精品吴梦梦| 久久人人爽人人爽人人片av高请| 欧美激情亚洲一区| 亚洲韩国日本中文字幕| 中文字幕久久久av一区| 91经典在线视频| 久久亚洲精品小早川怜子66| 亚洲图片欧美日产| 国产精品视频公开费视频| 国产不卡一区二区在线播放| 91欧美视频网站| 亚洲人成网站999久久久综合| 青青草原成人在线视频| 成人a视频在线观看| 欧美高清性猛交| 国产精品91在线观看| 日韩在线视频观看正片免费网站| 欧美激情性做爰免费视频| 91国产精品91| 亚洲精品中文字| 色综合久综合久久综合久鬼88| www亚洲精品| 九九久久精品一区| 久久久久久久久久久国产| 国产福利精品av综合导导航| 亚洲午夜女主播在线直播| 自拍偷拍亚洲一区| 日韩成人中文电影| 在线成人中文字幕| 国产精品久久久久久久app| 一区二区三欧美| 亚洲第一视频网站| 国产一区深夜福利| 国产成人一区二区三区小说| 午夜精品一区二区三区在线播放| 欧美色视频日本高清在线观看| 97在线视频国产| 欧美在线性爱视频| 欧美激情高清视频| 亚洲人成网站色ww在线| 国产偷国产偷亚洲清高网站| 97精品国产97久久久久久春色| 欧美精品videossex88| 蜜臀久久99精品久久久久久宅男| 亚洲精品免费在线视频| 欧美色视频日本版| 亚洲欧美国产精品va在线观看| 国精产品一区一区三区有限在线| 狠狠躁夜夜躁人人爽天天天天97| 国产一区在线播放| 欧美色xxxx| 国产不卡视频在线| 九九热在线精品视频| 亚洲第一综合天堂另类专| 精品无码久久久久久国产| 欧美激情免费在线| 久久天天躁狠狠躁老女人| 国产视频自拍一区| 亚洲美女免费精品视频在线观看| 91丨九色丨国产在线| 久久人人爽人人爽人人片av高清| 精品国产美女在线| 欧美精品精品精品精品免费| 国产精品视频专区| 亚洲日韩第一页| 欧美成人午夜剧场免费观看| 国产成人av网址| 亚洲护士老师的毛茸茸最新章节| 成人免费淫片aa视频免费| 日韩成人免费视频| 国产精品福利在线观看网址| 国产欧美精品xxxx另类| 精品久久久久久久久久ntr影视| 欧美一区二区视频97| www欧美日韩| 欧美激情一区二区三级高清视频| 中文字幕日韩欧美| 97人人爽人人喊人人模波多| 国产97色在线| 中文字幕欧美日韩精品| 欧美人交a欧美精品| 日韩中文在线中文网在线观看| 国内精品久久久久影院 日本资源| 国产精品自产拍在线观看| 精品国产电影一区| 国产精品免费福利| 国产精品久久久久av| 九九九热精品免费视频观看网站| 国产精品三级在线| 日韩欧美中文在线| 91wwwcom在线观看| 欧美性生交xxxxxdddd| 亚洲精品一区中文| 日韩精品免费综合视频在线播放| 久久亚洲精品一区| 亚洲天堂av高清| 欧美成人久久久| 欧美电影免费在线观看| 欧洲永久精品大片ww免费漫画| 久久的精品视频| 欧美日韩国产成人在线观看| 在线视频欧美性高潮| 日韩成人中文字幕在线观看| 欧美洲成人男女午夜视频| 欧美做爰性生交视频| 国产精品v片在线观看不卡| 亚洲欧美在线免费| 日韩在线国产精品| 青草青草久热精品视频在线网站| 亚洲国产欧美一区| 国产精品色午夜在线观看| 中日韩午夜理伦电影免费| 久久6免费高清热精品| 欧美综合在线第二页| 久久亚洲精品国产亚洲老地址| 一区二区三区黄色| 日韩精品高清在线观看| 亚洲一区www| 久久久亚洲精选| 4k岛国日韩精品**专区| 欧美日本中文字幕| 国模叶桐国产精品一区| 久热精品视频在线观看| 97在线看福利| 国产裸体写真av一区二区| 国内揄拍国内精品| 91色琪琪电影亚洲精品久久| 欧洲精品毛片网站| 欧美乱大交xxxxx另类电影| 国产精品爱久久久久久久| 亚洲**2019国产| 国产精品欧美一区二区三区奶水| 国产99久久久欧美黑人| 国产精品久久久久久久久久ktv| 97精品国产97久久久久久春色| 日韩成人小视频| 亚洲品质视频自拍网| 国产日韩精品在线播放| 成人激情视频在线观看| 亚洲第一区在线观看| 国产精品主播视频| 亚洲男人7777| 亚洲成人久久电影| 欧美大片网站在线观看| 日本午夜精品理论片a级appf发布| 国产精品久久网| 亚洲精品黄网在线观看| 色小说视频一区| 久久精品视频亚洲| 欧洲s码亚洲m码精品一区| 九九九久久久久久| 青草青草久热精品视频在线网站| 亚洲精品综合精品自拍| 国产精品久久久久一区二区| 一本色道久久88精品综合| 亚洲国产成人久久综合| 亚洲精品之草原avav久久|