As3.0中的位图(Bitmap/BitmapData)编程

1.位图使用(模糊)滤镜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//创建一个矩形区域的BitmapData
var  bmd:BitmapData = new  BitmapData( 80 , 30 , false , 0xefefef );
 
//画个红色的矩形
var  rect:Rectangle = new  Rectangle( 20 , 10 , 40 , 10 );
bmd.fillRect(rect, 0xFF0000 );
 
//找到红色矩形的右上顶点
var  pt:Point = new  Point(rect.left, rect.top);
 
//定义一个模糊滤镜
var  filter:BlurFilter = new  BlurFilter( 8 , 8 , 1 );
 
//应用滤镜
bmd.applyFilter(bmd, rect, pt, filter);
 
//创建一个位图对象,并加入到舞台
var  bm:Bitmap = new  Bitmap(bmd);
 
bm.scaleX = bm.scaleY = 2.0 ;
bm.x = stage.stageWidth/ 2  -bm.width/ 2 ;
bm.y = stage.stageHeight/ 2  - bm.height/ 2  ;
 
addChild(bm);

2.像素拷贝及赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var  bmd1:BitmapData = new  BitmapData( 90 , 60 , false , 0x00000000 );
var  bmd2:BitmapData = bmd1.clone(); //拷贝
 
//"画"一条白色的线
for ( var  i: uint = 10 ;i<= 40 ;i++){
     bmd1.setPixel32(i, i, 0xFFFFFFFF );
}
 
trace (bmd1.getPixel32( 10 , 10 ).toString( 16 )); // ffffffff
trace (bmd2.getPixel32( 10 , 10 ).toString( 16 )); // ff000000
 
var  bm1:Bitmap = new  Bitmap(bmd1);
this .addChild(bm1);
bm1.x =bm1.y = 5 ;
 
var  bm2:Bitmap = new  Bitmap(bmd2);
bm2.x = 105 ;
bm2.y = 5 ;
this .addChild(bm2);

3.颜色变换

1
2
3
4
5
6
7
8
9
10
11
12
var  bmd:BitmapData = new  BitmapData( 80 , 30 , false , 0xFF0000 );
 
var  cTransform:ColorTransform = new  ColorTransform();
cTransform.alphaMultiplier = 0.8 ; //设置透明度因子为0.8
var  rect:Rectangle = new  Rectangle( 0 , 0 , 40 , 30 ); //定义左半边矩形区域
bmd.colorTransform(rect, cTransform); //对rect区域应用colorTransform
 
var  bm:Bitmap = new  Bitmap(bmd);
addChild(bm);
 
bm.x = stage.stageWidth/ 2  - bm.width/ 2 ;
bm.y = stage.stageHeight/ 2  - bm.height/ 2 ;

4.比较位图差异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var  bmd1:BitmapData = new  BitmapData( 50 , 50 , true , 0xFFFFAA00 );
var  bmd2:BitmapData = new  BitmapData( 50 , 50 , true , 0xCCFFAA00 );
var  diffBmpData:BitmapData = BitmapData(bmd1.compare(bmd2));
var  diffValue: String  = diffBmpData.getPixel32( 1 , 1 ).toString( 16 );
//解释:当二个位置尺寸大小相同,且仅alpha分量不同时,compare的值为 zzFFFFFF,其中zz为bmd1与bmd2的alpha分量差
trace  (diffValue); // 33ffffff
 
var  bm1:Bitmap = new  Bitmap(bmd1);
addChild(bm1);
bm1.x = bm1.y = 5 ;
var  bm2:Bitmap = new  Bitmap(bmd2);
addChild(bm2);
bm2.x = 60 ;
bm2.y = 5 ;
 
var  bmDiff = new  Bitmap(diffBmpData);
addChild(bmDiff);
bmDiff.x = 115 ;
bmDiff.y = 5 ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var  bmd1:BitmapData = new  BitmapData( 50 , 50 , true , 0xFF00FF99 );
var  bmd2:BitmapData = new  BitmapData( 50 , 50 , true , 0x99AA3366 );
var  diffBmpData:BitmapData = BitmapData(bmd1.compare(bmd2));
var  diffValue: String  = diffBmpData.getPixel32( 1 , 1 ).toString( 16 );
//解释:当二个位置尺寸大小相同,但RGB分量不同时,compare的值为 FFxxyyzz,其中xx,yy,zz分别为bm1与bm2的RGB分量差,同时alpha分量差将被忽略
trace  (diffValue); // ff56cc33
 
var  bm1:Bitmap = new  Bitmap(bmd1);
addChild(bm1);
bm1.x = bm1.y = 5 ;
var  bm2:Bitmap = new  Bitmap(bmd2);
addChild(bm2);
bm2.x = 60 ;
bm2.y = 5 ;
 
var  bmDiff = new  Bitmap(diffBmpData);
addChild(bmDiff);
bmDiff.x = 115 ;
bmDiff.y = 5 ;

5.拷贝颜色通道

1
2
3
4
5
6
7
8
9
10
var  bmd:BitmapData = new  BitmapData(stage.stageWidth, stage.stageHeight, false , 0x00FF0000 );
 
var  rect:Rectangle = new  Rectangle( 0 , 0 , 20 , 40 );
var  pt:Point = new  Point( 10 , 10 );
bmd.copyChannel(bmd, rect, pt, BitmapDataChannel.RED, BitmapDataChannel.BLUE); //将红色通道复制到以(10,10)为顶点,宽为20,高为40的矩形区域的蓝色通道中
 
trace (bmd.getPixel32( 10 , 10 ).toString( 16 )); //ffff00ff,即矩形区域的最终颜色值为ff ff 00 ff(纯红 叠加 纯蓝)
 
var  bm:Bitmap = new  Bitmap(bmd);
this .addChild(bm);

6.截取位图的某一部分(像素)

1
2
3
4
5
6
7
8
9
10
11
12
var  bmd1:BitmapData = new  BitmapData( 40 , 40 , false , 0x000000FF );
var  bmd2:BitmapData = new  BitmapData( 80 , 40 , false , 0x0000CC44 );
 
var  rect:Rectangle = new  Rectangle( 0 , 0 , 20 , 20 );
var  pt:Point = new  Point( 10 , 10 );
bmd2.copyPixels(bmd1, rect, pt); //将bmd1中以pt为左上顶点的rect矩形像素复制到bmd2中
 
var  bm1:Bitmap = new  Bitmap(bmd1);
this .addChild(bm1);
var  bm2:Bitmap = new  Bitmap(bmd2);
this .addChild(bm2);
bm2.x = 50 ;

7.将文本转换为位图

1
2
3
4
5
6
7
8
9
10
11
12
13
import  flash.display.Bitmap;
import  flash.display.BitmapData;
import  flash.text.TextField;
 
var  tf:TextField = new  TextField();
tf.text = "bitmap text" ;
 
var  myBitmapData:BitmapData = new  BitmapData( 80 , 20 );
myBitmapData.draw(tf);
var  bmp:Bitmap = new  Bitmap(myBitmapData);
this .addChild(bmp);
bmp.x = stage.stageWidth/ 2  - bmp.width/ 2 ;
bmp.y = stage.stageHeight/ 2  - bmp.height/ 2 ;

8.仿PS中的颜色填充工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//准备一个40*40绿色背景的BitmapData
var  myBitmapData:BitmapData = new  BitmapData( 40 , 40 , false , 0x0000FF00 );
 
//画二个有“交叉重叠”部分的“蓝色”矩形
var  rect:Rectangle = new  Rectangle( 0 , 0 , 25 , 25 );
myBitmapData.fillRect(rect, 0x000000FF );
rect = new  Rectangle( 20 , 20 , 20 , 20 );
myBitmapData.fillRect(rect, 0x000000FF );
 
//从坐标(10,10)开始寻找与(10,10)坐标(像素点相同且连续的区域)填充红色
myBitmapData.floodFill( 10 , 10 , 0x00FF0000 );
 
var  bm:Bitmap = new  Bitmap(myBitmapData);
addChild(bm);
 
bm.scaleX  = bm.scaleY = 3.0 ;
bm.x = stage.stageWidth/ 2  - bm.width/ 2 ;
bm.y = stage.stageHeight/ 2  - bm.height/ 2 ;

9.颜色融合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import  flash.display.Bitmap;
import  flash.display.BitmapData;
import  flash.geom.Rectangle;
import  flash.geom.Point;
 
var  bmd1:BitmapData = new  BitmapData( 100 , 80 , true , 0xFF00FF00 );
var  bmd2:BitmapData = new  BitmapData( 100 , 80 , true , 0xFFFF0000 ); //如果bmd2透明度为0就能达到抠图的效果
var  rect:Rectangle = new  Rectangle( 0 , 0 , 40 , 40 );
var  pt:Point = new  Point( 20 , 20 );
var  mult: uint  = 0x80 ; // 50% ,各通道值均为128,即50%
bmd1.merge(bmd2, rect, pt, mult, mult, mult, mult);
 
var  bm1:Bitmap = new  Bitmap(bmd1);
addChild(bm1);
var  bm2:Bitmap = new  Bitmap(bmd2);
addChild(bm2);
bm2.x = 110 ;
 
//最终值
//new redDest = [(redSrc * redMultiplier) + (redDest * (256 - redMultiplier))] / 256;
trace (bmd1.getPixel32( 20 , 20 ).toString( 16 )); //ff7f7f00
 
//解释:
//返回值中Red分量为 7f = 0x00 * 0x80 + 0xff*(0x100-0x80)/0x100

10.噪点图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var  bmd1:BitmapData = new  BitmapData( 80 , 80 );
var  bmd2:BitmapData = new  BitmapData( 80 , 80 );
 
var  seed: int  = int (Math.random() * int .MAX_VALUE);
bmd1.noise(seed, 0 , 0xFF , BitmapDataChannel.RED, false );
bmd2.noise(seed, 0 , 0xFF , BitmapDataChannel.RED, true );
 
var  bm1:Bitmap = new  Bitmap(bmd1);
this .addChild(bm1);
bm1.x = 10 ;
bm1.y = 10 ;
var  bm2:Bitmap = new  Bitmap(bmd2);
this .addChild(bm2);
bm2.x = 100 ;
bm2.y = 10 ;
 
 
stage.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
 
function  enterFrameHandler(e:Event): void {
     seed = Math.floor(Math.random() * int .MAX_VALUE);
     bmd1.noise(seed, 0 , 0xFF , BitmapDataChannel.RED, false );
     bmd2.noise(seed, 0 , 0xFF , BitmapDataChannel.RED, true );
     bm1.bitmapData = bmd1;
     bm2.bitmapData = bmd2;
}

11.另一种噪点图(有点类似卫星云图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import  flash.display.Bitmap;
import  flash.display.BitmapData;
 
var  bmd:BitmapData = new  BitmapData( 200 , 200 , false , 0x00CCCCCC );
 
var  seed: Number  = Math.floor(Math.random() * 999999 );
var  channels: uint  = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE;
bmd.perlinNoise( 100 , 80 , 6 , seed, false , true , channels, false , null );
 
var  bm:Bitmap = new  Bitmap(bmd);
addChild(bm);
bm.x = stage.stageWidth/ 2  - bm.width/ 2 ;
bm.y = stage.stageHeight/ 2  - bm.height/ 2 ;
 
stage.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
 
function  enterFrameHandler(e:Event): void {
     seed = Math.floor(Math.random() * 999999 );
     bmd.perlinNoise( 100 , 80 , 6 , seed, false , true , channels, false , null );
     bm.bitmapData = bmd;   
}

12.像素融解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import  flash.display.BitmapData;
import  flash.display.Bitmap;
import  flash.geom.Point;
import  flash.geom.Rectangle;
import  flash.utils.Timer;
import  flash.events.TimerEvent;
 
var  rndColor: int  = Math.random() * 0xffffffff ; //随机背景色
var  fillColor: int  = Math.random() * 0xffffffff ; //随机填充色
 
var  bmd:BitmapData = new  BitmapData( 100 , 100 , false , rndColor);
var  bitmap:Bitmap = new  Bitmap(bmd);
addChild(bitmap);
 
bitmap.scaleX = bitmap.scaleY = 1.5 ;
bitmap.x = stage.stageWidth/ 2  - bitmap.width/ 2 ;
bitmap.y = stage.stageHeight/ 2  - bitmap.height/ 2 ;
 
var  tim:Timer = new  Timer( 20 );
tim.start();
tim.addEventListener(TimerEvent.TIMER, timerHandler);
  
function  timerHandler(event:TimerEvent): void  {
     var  randomNum: Number  = Math.floor(Math.random() * int .MAX_VALUE);
     dissolve(randomNum);
}
 
function  dissolve(randomNum: Number ): void  {
     var  rect:Rectangle = bmd.rect;
     var  pt:Point = new  Point( 0 , 0 );
     var  numberOfPixels: uint  = 100 ; //每次融解100个像素   
     bmd.pixelDissolve(bmd, rect, pt, randomNum, numberOfPixels, fillColor);
     var  grayRegion:Rectangle = bmd.getColorBoundsRect( 0xFFFFFFFF , rndColor, true );
     
     if (grayRegion.width == 0  && grayRegion.height == 0  ) {
         bmd.dispose();
         rndColor = Math.random() * 0xffffffff ;
         fillColor = Math.random() * 0xffffff ;
         bmd = new  BitmapData( 100 , 100 , false , rndColor);
         bitmap.bitmapData = bmd;
         
         //tim.stop();
     }
}

13.查找满足条件的颜色并替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import  flash.display.Bitmap;
import  flash.display.BitmapData;
import  flash.display.BitmapDataChannel;
import  flash.geom.Point;
import  flash.geom.Rectangle;
 
var  bmd1:BitmapData = new  BitmapData( 200 , 200 , true , 0xFFCCCCCC );
 
var  seed: int  = int (Math.random() * int .MAX_VALUE);
var  channels: uint  = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
bmd1.perlinNoise( 100 , 80 , 12 , seed, false , true , channels, false , null );
 
var  bitmap1:Bitmap = new  Bitmap(bmd1);
addChild(bitmap1);
 
var  bmd2:BitmapData = new  BitmapData( 200 , 200 , true , 0xFFCCCCCC );
var  pt:Point = new  Point( 0 , 0 );
var  rect:Rectangle = new  Rectangle( 0 , 0 , 200 , 200 );
var  threshold: uint  0x00800000 ; //50%的红色通道值
var  color: uint  = 0x80FF0000 ; //替换后的颜色
var  maskColor: uint  = 0x00FF0000 ; //因为只查找红色通道,所以遮罩仅为纯红色通道
bmd2.threshold(bmd1, rect, pt, ">" , threshold, color, maskColor, true );
 
var  bitmap2:Bitmap = new  Bitmap(bmd2);
bitmap2.x = bitmap1.x + bitmap1.width + 10 ;
addChild(bitmap2);
 
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
 
function  EnterFrameHandler(e:Event): void {
     seed = int (Math.random() * int .MAX_VALUE);
     bmd1.perlinNoise( 100 , 80 , 12 , seed, false , true , channels, false , null );
     bitmap1.bitmapData = bmd1;
     bmd2.threshold(bmd1, rect, pt, ">" , threshold, color, maskColor, true );
     bitmap2.bitmapData = bmd2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值