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

来源:互联网 发布:配乐诗朗诵软件 编辑:程序博客网 时间:2024/05/01 12:34

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;
}

原创粉丝点击