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