×

关注微信公众号

免备案网站空间虚拟主机双线空间域名查询PS数码后期
photoshop互助课堂数百G视频教程下载英语培训机构初中英语如何学随时随地聆听大师开讲/课堂
酷素材!视频教程打包下手绘教程抠图教程路径专辑photoshop cs3视频教程
查看: 5913|回复: 19

BitmapData 基础-实例1

  [复制链接]
发表于 2011-3-23 17:32:16 | 显示全部楼层 |阅读模式
BitmapData 类是一个比较常用和中高级难度的类,用好这个类,可以说是半支脚踏入了 Flash 高手的大门。

Bitmapdata 继承 Object 对象,实现 IBitmapDrawable 接口,这个接口有什么用,你可以理解为 Drawable 能被画。官方介绍是:IBitmapDrawable 接口可作为 BitmapData 类 draw()方法的 source 参数传递的对象来实现。 这些对象的类型为 BitmapData 或 DisplayObject。 其实就是能被“画”。

BitmapData 主要提供的是对图像的“像素级”的操作,那么 BitmapData 的像素级操作作用在哪呢?大家比较喜欢的就是粒子效果,作为一个需要大量计算的应用来说,1像素长宽的粒子无疑是能存在的最小的粒子;另外一个是作为数据传输,大家如果想实现上传图片或者下载图片的效果,基本的理念就是将Bitmapdata 使用 JPEGEncoder 编码成二进制数据,把二进制发送给服务器端;第三种是滤镜视觉特效,例如一些水波划动特效;第四种是视频摄像头的视频检测;当然还有很多有趣的玩法,例如通过Bitmapdata压缩数据之类的。

BitmapData 的公共属性只有4种,而且都属于Read-Only(只读),可以取出BitmapData的属性来做运算,但是却不能赋值给它们。公共方法一共有32个。

构造方法

BitmapData(width:int, height:int, transparent:Boolean = true, fillColor:uint = 0xFFFFFFFF)

构造方法有4个参数,其中两个必填,就是长宽,这两个值的输入保持“用多少填多少”的原则,因为 Bitmapdata也是一种形式的内存开销,所以能省就省。第三个是transparent,就是是否允许透明像素,原则同上,如果能确定不用的话,最好关掉,默认为允许,第四个为填充颜色,bitmapdata既然是data,那肯定要有初始数据的存在,一开始是一些纯色的填充,默认为白色。

具体属性和方法的使用可参见CS3帮助文档:BitmapData 类


BitmapDataExample1.as
  1. package
  2. {
  3.         import flash.display.Bitmap;
  4.         import flash.display.BitmapData;
  5.         import flash.display.Sprite;
  6.         import flash.display.StageAlign;
  7.         import flash.display.StageScaleMode;
  8.         import flash.events.Event;
  9.         import flash.events.MouseEvent;
  10.        
  11.         [SWF(backgroundColor="#CCCCCC", frameRate="30", width="400", height="400")]
  12.         public class BitmapDataExample1 extends Sprite
  13.         {
  14.                 private var bm:Bitmap;

  15.                 public function BitmapDataExample1()
  16.                 {
  17.                         //do some general housekeeping
  18.                         stage.align = StageAlign.TOP_LEFT;
  19.                         stage.scaleMode = StageScaleMode.NO_SCALE;
  20.                        
  21.                         //create a new BitmapData object
  22.                         var bmd:BitmapData = new BitmapData(300, 300, false, 0x000000);
  23.                         //create bitmap and pass in BitmapData object
  24.                         bm = new Bitmap(bmd);
  25.                         //add bitmap to stage
  26.                         bm.x = 50;
  27.                         bm.y = 50;
  28.                         addChild(bm);
  29.                         //add loop
  30.                         addEventListener(Event.ENTER_FRAME, loop);
  31.                         //add listener to stage as bitmaps dont dispatch mouse events
  32.                         stage.addEventListener(MouseEvent.CLICK, reset);
  33.                 }
  34.                
  35.                 //run every frame
  36.                 private function loop(event:Event):void
  37.                 {
  38.                         //choose random x and y positions
  39.                         var xp:uint = uint(Math.random()* 300);
  40.                         var yp:uint = uint(Math.random()* 300);
  41.                         //choose random colour
  42.                         var c:uint = uint(Math.random()* 0xFFFFFF);
  43.                         //set pixel
  44.                         bm.bitmapData.setPixel(xp, yp, c);
  45.                 }
  46.                
  47.                 private function reset(event:MouseEvent):void
  48.                 {
  49.                         //remove old bitmapData object
  50.                         bm.bitmapData.dispose();
  51.                         //insert new bitmapData object
  52.                         bm.bitmapData = new BitmapData(100, 100, false, 0x000000);
  53.                 }
  54.                
  55.         }
  56. }
复制代码

BitmapDataExample2.as
  1. package
  2. {
  3.         import flash.display.Bitmap;
  4.         import flash.display.BitmapData;
  5.         import flash.display.Sprite;
  6.         import flash.display.StageAlign;
  7.         import flash.display.StageScaleMode;
  8.         import flash.events.Event;
  9.         import flash.events.MouseEvent;
  10.         import flash.geom.Matrix;
  11.         import flash.text.TextField;
  12.         import flash.text.TextFormat;
  13.        
  14.         [SWF(backgroundColor="#CCCCCC", frameRate="30", width="550", height="300")]
  15.         public class BitmapDataExample2 extends Sprite
  16.         {
  17.                 private var bm:Bitmap;
  18.                 private var mc:Sprite;
  19.                
  20.                 //store scale and rotation angle for draw(...)
  21.                 private var xscale:Number = 1;
  22.                 private var yscale:Number = 1;
  23.                 private var angle:Number = 0;

  24.                 public function BitmapDataExample2()
  25.                 {
  26.                         //do some general housekeeping
  27.                         stage.align = StageAlign.TOP_LEFT;
  28.                         stage.scaleMode = StageScaleMode.NO_SCALE;

  29.                         //create a new display object to copy from
  30.                         //filled with any old stuff
  31.                         mc = new Sprite();
  32.                         mc.x = 50;
  33.                         mc.y = 50;
  34.                         addChild(mc);
  35.                         resetSource();
  36.                         //draw a border behind it so we can see the bounds
  37.                         graphics.lineStyle(1, 0xFF9900);
  38.                         graphics.drawRect(50, 50, 200, 200);

  39.                         //create a new BitmapData object to copy to
  40.                         var bmd:BitmapData = new BitmapData(200, 200, false, 0x000000);
  41.                         //create bitmap and pass in BitmapData object
  42.                         bm = new Bitmap(bmd);
  43.                         //add bitmap to stage
  44.                         bm.x = 300;
  45.                         bm.y = 50;
  46.                         addChild(bm);
  47.                         //add loop
  48.                         addEventListener(Event.ENTER_FRAME, loop);
  49.                         //add listener
  50.                         stage.addEventListener(MouseEvent.CLICK, reset);
  51.                 }
  52.                
  53.                 //run every frame
  54.                 private function loop(event:Event):void
  55.                 {
  56.                         //create matrix to do transformation
  57.                         var m:Matrix = new Matrix();
  58.                         //scale and rotate
  59.                         //translate x and y set to mid point of destination so it will rotate around that point
  60.                         m.createBox(xscale, yscale, angle, 50, 50);
  61.                         //copy
  62.                         bm.bitmapData.draw(mc, m);
  63.                         //reduce the scale each time
  64.                         xscale -= 0.005;
  65.                         yscale -= 0.005;
  66.                         //update angle
  67.                         angle += Math.PI / 50;
  68.                 }
  69.                
  70.                 private function reset(event:MouseEvent):void
  71.                 {
  72.                         //remove old bitmapData object
  73.                         bm.bitmapData.dispose();
  74.                         //insert new bitmapData object
  75.                         bm.bitmapData = new BitmapData(200, 200, false, 0x000000);
  76.                         //redraw source
  77.                         resetSource();
  78.                         //reset scales
  79.                         xscale = 1;
  80.                         yscale = 1;
  81.                 }
  82.                
  83.                 private function resetSource():void
  84.                 {
  85.                         //
  86.                         mc.graphics.clear();
  87.                         //random circles
  88.                         for (var i:uint=0;i<20;i++)
  89.                         {
  90.                                 mc.graphics.beginFill(Math.random()*0xFFFFFF);
  91.                                 mc.graphics.drawCircle(Math.random()* 180 + 10, Math.random()* 180 + 10, 10);
  92.                         }
  93.                 }
  94.                
  95.         }
  96. }
复制代码

评分

参与人数 1 +8 +2 收起 理由
sanbos + 8 + 2 多谢教程,辛苦了。

查看全部评分

发表于 2011-3-23 17:36:10 | 显示全部楼层
{:1_176:}
回复 支持 反对

使用道具 举报

发表于 2011-3-23 18:35:01 | 显示全部楼层

作业

本帖最后由 龙井茶馆 于 2011-3-23 18:44 编辑


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[免费注册]

x
回复 支持 反对

使用道具 举报

发表于 2011-3-24 03:56:57 | 显示全部楼层
向两位老师学习。谢谢你们的无私奉献。
回复 支持 反对

使用道具 举报

发表于 2011-3-28 14:49:13 | 显示全部楼层
cao4811老师:我想请教一个关于位图类的位移运算符的问题:譬如自定义构造的bmd = new BitmapData(320,240,true,0x0)        var bm:Bitmap = new Bitmap(bmd);
在确定bm的坐标时:bm.x = (stage.stageWidth - bm.width) >> 1;   
这句代码我不甚理解,为什么要用舞台宽减bm的自身宽度?
>> 1位移运算符在这里是什么含义?
敬请老师能帮我解答一下好吗?谢谢了!拜托!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-29 12:03:21 | 显示全部楼层
回复 知否 的帖子

将stage.stageWidth-bm.width的值转换为32位整数并向右移1位。
关于按位移位运算符看一下ActionScript 2.0 语言参考中的相应条目。

舞台的宽度是左右边界,物体是有宽、高属性的。如果物体的位置由中心的注册点的位置决定,而注册点超出了舞台的左右边界,物体将被移除。如果物体运动得非常缓慢,我们会看着它走向屏幕的边界,但还差一半没有走完就被移除了。所以,要让物体完全离开场景,要等到它完全离开视野后再采取处理。
回复 支持 反对

使用道具 举报

发表于 2011-3-29 12:33:02 | 显示全部楼层
        在此先谢谢cao4811老师!您的提示我已记下了! 看了有关ActionScript 2.0 语言参考中的相应条目后,再好好琢磨!
谢谢!jc:victory
回复 支持 反对

使用道具 举报

发表于 2011-3-29 14:55:21 | 显示全部楼层
这个老师够耐心的,好人一个。
回复 支持 反对

使用道具 举报

发表于 2011-3-30 17:21:02 | 显示全部楼层
扬子风朋友说的对!我在这个互助课堂学到了很多东西,实在是和老师的耐心指导分不开的!我在这里请教的问题基本上都得到了回应!所以,我喜欢在这里学AS!
回复 支持 反对

使用道具 举报

发表于 2011-6-16 11:38:47 | 显示全部楼层
不知道什么时候恢复正常,现在是不能下载的,我等了许多天了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-17 07:18:11 | 显示全部楼层
回复 扬子风 的帖子

是要下载SWF文件吗?给你发上去。其实不必下载SWF文件,复制代码,测试一下就可以得到SWF文件了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[免费注册]

x
回复 支持 反对

使用道具 举报

发表于 2012-1-11 09:23:54 | 显示全部楼层
谢谢老师。
回复 支持 反对

使用道具 举报

发表于 2012-6-25 17:53:56 | 显示全部楼层
为什么总是说包不能嵌套
回复 支持 反对

使用道具 举报

发表于 2012-8-14 10:51:15 | 显示全部楼层
cao4811 发表于 2011-6-17 07:18
回复 扬子风 的帖子

是要下载SWF文件吗?给你发上去。其实不必下载SWF文件,复制代码,测试一下就可以得到 ...

可我得到的是包不能嵌套,为什么?
回复 支持 反对

使用道具 举报

发表于 2013-6-7 10:28:42 | 显示全部楼层
难得一见的给力帖子哈。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | [免费注册]

本版积分规则