EaselJS图片处理

  • Bitmap

使用Bitmap类可以非常方便的处理图片,Bitmap可以用来代表任何形式,比如,Canvas,视频或者图片,可以使用已经存在的元素实例化,或者使用base64。

var img = new Image();
  img.src = "http://www.gbtags.com/gb/laitu/200x200&text=GBtags/444444/ffffff";
  img.onload = handleImageLoad;
  
  //添加并且处理图片相关属性
  function handleImageLoad(){
      for(var i = 0;i<3;i++){
          var tempBitMap = new createjs.Bitmap(img);
          var randX = Math.floor(Math.random()* 500);
          var randY = Math.floor(Math.random() * 250);
          var randomColor = "#"+Math.floor(Math.random()*16777215).toString(16);
          var randomXOffset  = Math.floor(Math.random() * 10) + 5;
          var randomYOffset  = Math.floor(Math.random() * 10) + 5;
          stage.addChild(tempBitMap);
          tempBitMap.x = randX;
          tempBitMap.y = randY;
          tempBitMap.rotation = Math.floor(Math.random() * 360);
          tempBitMap.shadow = new createjs.Shadow(randomColor, randomXOffset, randomYOffset, 10);
      }
      stage.update();
  }
  • Sprite

Sprite用来在SpriteSheet中显示一个动画或者一系列的动画帧,SpriteSheet是将一系列的图片整合到一张图片中,可以用来定义一个完整的动画。

var spritesheet = new createjs.SpriteSheet({
"images": [characterImage], //动画人物图片来自base64编码字符串
"frames": {"height": 96, "count": 10, "width": 75},
"animations": { run: [0,9]}
});

以上代码包含了三个重要的参数:

  1. 图片定义(这里使用base64字符串编码图片)
  2. 帧定义(定义图片中每一帧使用的图片大小)
  3. 定义动画(比如,从开始到结束,或者定义成[0,1,2,3,4,5,6...]

播放动画可以使用sprite的play方法,停止可以使用stop或者gotoAndStop

window.onload=function(){

  var canvas = document.getElementById("myCanvas"),
    stage = new createjs.Stage(canvas);

  function setup() {
      var spritesheet = new createjs.SpriteSheet({
              "images": [characterImage], //动画人物图片来自base64编码字符串
              "frames": {"height": 96, "count": 10, "width": 75},
              "animations": { run: [0,9]}
          });
          
      var character = new createjs.Sprite(spritesheet, "run");
      character.framerate = 10; 
      character.play();//播放动画
      stage.addChild(character);

      createjs.Ticker.addEventListener("tick", tick);
  }
  
  function tick(event) {
      stage.update();
  }
  
  setup();
  
}
  • Container

Container类是EaselJS中用来管理符合图形的单位,例如,我们可以将一个人物的,头,手,脚等等放置在统一的容器中,这样一来,可以统一的管理或者动画图形。虽然容器中每一个部分都可以单独的生成动画,但是容器中的子元素都可以统一使用容器的属性来控制。

window.onload=function(){
  var canvas = document.getElementById("myCanvas");
  var stage = new createjs.Stage(canvas);
  
  //创建容器
  var container = new createjs.Container();
  //添加容器到stage
  stage.addChild(container);
  
  stage.on("stagemousedown",moveContainer,null,false);
  
  function setup(){
      for(var i = 0;i<3;i++){
          var tempBitMap = new createjs.Bitmap('http://www.gbtags.com/gb/laitu/180x130&text=GBtags/222222/FFFFFF');
          tempBitMap.x = 0;
          tempBitMap.y = i * 140;
          
          //添加图片到容器
          container.addChild(tempBitMap);
      }
      stage.update();
      setTimeout(function(){stage.update()},1500);
  }
  
  //鼠标点击后出发的容器移动方法
  function moveContainer(){
      container.x +=20;
      stage.update();
  }
  
  setup();

}
  • Cache

在图形处理中,往往会有一些图形不太变化,而每次都重新渲染会使得性能比较受影响。

在EaselJS中提供了cache()方法,这个方法可以帮助生成绘制时需要使用的图形到新画布里,它不会在每一个tick中被重新绘制,因此加载速度快,性能更好。

被cache的显示图形也可以自由的控制移动,旋转,淡入淡出等等属性,但图形变化了需要手动调用cache或者updateCache方法重新加载。

需要指定cache的矩形区域相关x, y, w,和h参数。

指定的这个矩形区域会被重新渲染和cache。

注意不要cache相关图形Bitmap类型元素,因为性能会受影响,但是可以cache相关的图片滤镜(filter)。

//获取stage
var canvas = document.getElementById("myCanvas");
var stage = new createjs.Stage(canvas);
var radius = 20;
var colors = ["#828b20", "#b0ac31", "#cbc53d", "#fad779", "#f9e4ad", "#faf2db", "#563512", "#222222"];

for(var i=0;i<500;i++){
  var shape = new createjs.Shape();
  shape.graphics.beginFill(colors[Math.random() * colors.length | 0]).drawCircle(0, 0, radius);

  //修改图形坐标
  shape.x = Math.floor(Math.random() * 200);
  shape.y = Math.floor(Math.random() * 350);
  shape.velX = Math.random() * 10 - 5;
  shape.velY = Math.random() * 10 - 5;
  shape.alpha = Math.random() * 1;
  
  //尝试注释掉如下cache代码,比较一下FPS值的区别和动画性能区别
  shape.cache(-radius, -radius, radius * 2, radius * 2);
  
  stage.addChild(shape);
}

//添加一个FPS,比较一下性能区别
var fpsLabel = new createjs.Text("-- fps", "normal 24px Arial", "#FFF");
stage.addChild(fpsLabel);
fpsLabel.x = 10;
fpsLabel.y = 20;

createjs.Ticker.addEventListener("tick", tick);

function tick(event) {
  var w = canvas.width + radius * 2;
  var h = canvas.height + radius * 2;
  var l = stage.getNumChildren() - 1;

  for (var i = 1; i < l; i++) {
    var shape = stage.getChildAt(i);
    shape.x = (shape.x + radius + shape.velX + w) % w - radius;
    shape.y = (shape.y + radius + shape.velY + h) % h - radius;
  }
 
  fpsLabel.text = Math.round(createjs.Ticker.getMeasuredFPS()) + " fps";
  
  stage.update(event);
}
  • Filter(滤镜)

注意Filter需要在cache方法处理后的才可以执行,一旦图形变化了,需要再次调用cache,或者使用updateCache方法
EaselJS包含了一些内置的滤镜方法,如下:

  • AlphaMapFilter : 将一个灰度图形映射到一个图形的阿尔法通道
  • AlphaMaskFilter: 将一个图片的阿尔法通道映射到一个显示图形的阿尔法通道
  • BlurFilter: 执行水平和垂直的模糊
  • ColorFilter: 显示对象的颜色变形
  • ColorMatrixFilter: 使用ColorMatrix1来变形图片
window.onload=function(){
  var canvas = document.getElementById("myCanvas");
  stage = new createjs.Stage(canvas)
  
  stage.on("stagemousedown",colorPicture,null,false);
  var randNum = Math.random();
  var windmill;
  function setup(){
      windmill = new createjs.Bitmap('http://www.gbtags.com/gb/laitu/350x400');
      stage.addChild(windmill);
      stage.update();
      setTimeout(function(){stage.update()},3000);
  }
  
  function colorPicture(){
     windmill.filters = [new createjs.ColorFilter(1,0,0,1), 
                           new createjs.BlurFilter(5, 5, 10)
                           ];
     windmill.cache(0, 0, 600, 400);
     stage.update();
  }
  setup();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 仲基欧巴自从成为爆款之后,已经渐渐脱离了我男神圈标准的核心位置,但作为曾经的欧巴,我内心是拒绝站乔妹和仲基的CP的...
    小鹿橙子阅读 312评论 0 1
  • 不好意思,这是一篇读起来有点费力的文章,首先,请你思考一个问题: 你所拥有的最宝贵的财富是什么? 思考的分割线 —...
    yammypro阅读 275评论 1 1
  • 白雨跳珠乱入船——苏轼咏夏雨诗赏析 王传学 夏天来了,夏天的雨也会随时光临的。夏天的雨,常常雷电交加,倾盆大雨下个...
    王传学阅读 2,468评论 2 8