绝对有用的BitmapData类

阅读更多
注:1.完成本教程需要你的脑子高速运转,小心撞车!

2.不是1024核的电脑请把帧率调到10的负100次方FPS!

3.本教程会越来越难,请把USB接口接到您的鼻子上以防忘记知识!


BitmapData类可以直接处理位图,比如把一张位图转换成由无数细线构成的画,或者可以得知位图中一个点的RGB,甚至能做出面部识别器(我做过这个,利用人的头发识别脸的位置!)。
首先BitmapData类的构造方法:

1.
import flash.display.BitmapData;

var X:BitmapData = new BitmapData(A, B,C,D);

以上代码可以新建一个BitmapData类并设定宽、高、是否透明、背景色

X代表BitmapData类的名称
A 代表宽(数字)
B 代表高(数字)
C 代表是否可以显示透明位图(true/false布尔值)
D 代表背景色(0xXXXXXX是0x红红绿绿蓝蓝,如果C是true,就可以写为0xXXXXXXXX,就是0x红红绿绿蓝蓝ALPHA,注意是“零爱克斯XXXXXX”,不是“零哦XXXXXX”)

2.
import flash.display.BitmapData;

var X:BitmapData =BitmapData.loadBitmap("A")

以上代码可以新建一个BitmapData类并让它的宽和高等于一张图片的宽高并导入那张图片到这个类里(类的背景色默认为黑色0x000000)。

X代表BitmapData类的名称
A代表图片在库中的链接


如果BitmapData类是一个箱子,那么这个箱子里只能装照片(位图),而且这个箱子是隐藏的!要让它显示,一定要把它加载到影片剪辑里。

如:


import flash.display.BitmapData;

var
Bit:BitmapData =BitmapData.loadBitmap("PictureX");

var mc:MovieClip = this.createEmptyMovieClip("mc",0);

mc.attachBitmap(Bit);

以上代码将让mc这个剪辑里出现位图PictureX。



以上是最基本的知识。



若要知道一张位图中任意一个点的RGB,可以用X.getPixel(A,B)
X代表类的名字
A代表点的X
B代表点的Y
如: import flash.display.BitmapData;

var
Bit:BitmapData =BitmapData.loadBitmap("PictureX");

var mc:MovieClip = this.createEmptyMovieClip("mc",0);

mc.attachBitmap(Bit);

trace(Bit.getPixel(10,20));
这样会输出一串10进制数字,可你一定会说“我要的是RGB值!”没关系,我们来把它转换成RGB
RGB是一串16进制数字与英文字母的结合,如“0x3AB77F”, RGB的“0x”后的前两位是红色,中间两位是绿,剩下的两位是蓝。
常用的RGB:
0x000000 黑
0x00ff00
绿
0xffffff

0xff0000

0x0000ff

0xA0E2BC 一种舒服的绿色

刚才看到的10进制数字是RGB转换成10进制的数字。只要用toString()函数就可以解决转换问题
16进制=10进制.toString(16);
10进制=16进制.toString(10);
运用到RGB是同样的道理:

import flash.display.BitmapData;

var
Bit:BitmapData =BitmapData.loadBitmap("PictureX");

var mc:MovieClip = this.createEmptyMovieClip("mc",0);

mc.attachBitmap(Bit);

trace(“0x”+Bit.getPixel(10,20).toString(16));
这样就可以输出RGB了。



下面是自己写的实例教程:
1.
AS复制位图

[原理]
大家知道,位图由N个点组成。我们在FLASH中用AS绘制一张位图就是绘制N个点,可BitmapData类的画点函数画出的点太小了,所以这里我把画点函数用画线函数(moveTo();和lineTo();)代替。

原理是把目标位图上每个点的RGB记下来,再在制定位置用线画出来。
[用到的主要AS]
1.getPixel();
2.loadBitmap();
3.attachBitmap();
4.toString();
5.import
6.createEmptyMovieClip();
7.lineStyle();
8.moveTo();
9.lineTo();

大家把以上的AS函数用FLASH的帮助搞明白,我不在此介绍了。
[实例制作]
1.新建一FLASH,找一张大约100×75的位图,导入库中,在库里右击位图,点“链接”,把标识符改为“Pic”。
2.在第一帧上输入AS:
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+myBitmapData.getPixel(i2, i).toString(16);

_root.lineStyle(1, RGB, 100);

_root.moveTo(i2+190, i);

_root.lineTo(i2+191, i);

}
}
3.测试FLASH

是不是看到位图被COPY了?可是你一但放大看,会发现图片中有一些白线穿过,那是因为线和线之间有空隙,解决方法是:
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+myBitmapData.getPixel(i2, i).toString(16);

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+190, i);

_root.lineTo(i2+191, i);

}
}
我只改了一个字,很懒但很有效,我把线条加粗了。

接下来试试看把线打乱了:
(不是双核的小心,CPU低于1.8GZH的不要用超过50×50的图片,不然你要被电脑炸得从地球上消失的!)
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+myBitmapData.getPixel(i2, i).toString(16);

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+190+random(10), i+random(10));

_root.lineTo(i2+191+random(10), i+random(10));

}
}
是不是有点象油画,或者奥运会鸟巢那样?


2.
AS复制图片特效
[变色龙一样的图片]
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+(myBitmapData.getPixel(i2, i)+i*20).toString(16);

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+190, i);

_root.lineTo(i2+191, i);

}
}
或者把RGB = "0x"+(myBitmapData.getPixel(i2, i)+i*20).toString(16);
改为RGB = "0x"+(myBitmapData.getPixel(i2, i)+i2*20).toString(16);



[水晶相片](此效果需要清晰的图片)
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+(myBitmapData.getPixel(i2, i)+i*20).toString(16);

_root.lineStyle(2, RGB, i2);

_root.moveTo(i2+190, i);

_root.lineTo(i2+191, i);

}
}



[受损一样的照片]
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+myBitmapData.getPixel(i2, i).toString(16);

_root.lineStyle(2, RGB, random(100)+40);

_root.moveTo(i2+190, i);

_root.lineTo(i2+191, i);

}
}



[我扭!]
import flash.display.BitmapData;
var myBitmapData:BitmapData = BitmapData.loadBitmap("img");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
for (i=0; i<75; i++) {

for (i2=0; i2<100; i2++) {

RGB = "0x"+myBitmapData.getPixel(i2, i).toString(16);

_root.lineStyle(2, RGB, random(100)+40);

_root.moveTo(i2+190+i, i);

_root.lineTo(i2+191+i, i);

}
}


效果是无穷的,关键靠自己探索。


3.
影片剪辑变图片
[原理]
利用BitmapData.draw(影片剪辑的名称)可以把影片剪辑变成图片。
[实例]
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(40, 30);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
myBitmapData.draw(_root.movie);


4.
摄像头面部识别!
[原理]
利用人的头发与脸的颜色找到脸的位置
[实例]
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(40, 29.2);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
CAM.CA.attachVideo(Camera.get());
stop();
mc._x = 0;
mc._y = 50;
i = 0;
i2 = 0;
x = 40;
y = 29.2;
abc = 0;
M = false;
alc = 0;
ct = 0;
onEnterFrame = function () {

ct++;

myBitmapData.draw(CAM);

abc++;

if (i<(y-1)) {

for (a=0; a<292; a++) {

i2 += 2;

if (i2/x == int(i2/x)) {

i++;

i2 = 0;

}

alc += myBitmapData.getPixel(i2, i);

apc = int(alc/aac);

RGB = "0x"+(myBitmapData.getPixel(i2, i)).toString(16);

if (myBitmapData.getPixel(i2, i)*(2.6-apc/10000000)<16800000 && myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)>10543804) {

if (myBitmapData.getPixel(i2, i)*(2.6-apc/10000000)>13200000 || myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)<10401713) {

if (myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)>apc) {

cb = 0;

for (a1=0; a1
if (myBitmapData.getPixel(i2, i-a1)<500) {

cb++;

}

}

if (cb>=1) {

M = true;

RGB = "0x"+(50000).toString(16);

} else {

M = false;

RGB = "0x"+(5000).toString(16);

}

}

} else {

M = false;

}

} else {

M = false;

}

if (M == true) {

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+100, i+50);

_root.lineTo(i2+101, i+50);

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+200, i+50);

_root.lineTo(i2+201, i+50);

} else {

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+100, i+50);

_root.lineTo(i2+101, i+50);

}

}

} else {

i2 = 0;

i = 0;

}

if (ct/20 == int(ct/20)) {

_root.clear();

}
};


注意:这段代码仅在白天起效!,晚上的代码是:
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(40, 29.2);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
CAM.CA.attachVideo(Camera.get());
stop();
mc._x = 0;
mc._y = 50;
i = 0;
i2 = 0;
x = 40;
y = 29.2;
abc = 0;
M = false;
alc = 0;
ct = 0;
onEnterFrame = function () {

ct++;

myBitmapData.draw(CAM);

abc++;

if (i<(y-1)) {

for (a=0; a<292; a++) {

i2 += 2;

if (i2/x == int(i2/x)) {

i++;

i2 = 0;

}

alc += myBitmapData.getPixel(i2, i);

apc = int(alc/aac);

RGB = "0x"+(myBitmapData.getPixel(i2, i)).toString(16);

if (myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)<16800000 && myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)>10543804) {

if (myBitmapData.getPixel(i2, i)*(2.5-apc/10000000)>13200000 || myBitmapData.getPixel(i2, i)*(2.5-apc/10000000)<10401713) {

if (myBitmapData.getPixel(i2, i)*(2.7-apc/10000000)>apc) {

cb = 0;

for (a1=0; a1
if (myBitmapData.getPixel(i2, i-a1)<500) {

cb++;

}

}

if (cb>=1) {

M = true;

RGB = "0x"+(50000).toString(16);

} else {

M = false;

RGB = "0x"+(5000).toString(16);

}

}

} else {

M = false;

}

} else {

M = false;

}

if (M == true) {

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+100, i+50);

_root.lineTo(i2+101, i+50);

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+200, i+50);

_root.lineTo(i2+201, i+50);

} else {

_root.lineStyle(2, RGB, 100);

_root.moveTo(i2+100, i+50);

_root.lineTo(i2+101, i+50);

}

}

} else {

i2 = 0;

i = 0;

}

if (ct/20 == int(ct/20)) {

_root.clear();

}
};
(这是我苦苦琢磨了三天做的,看懂了绝对牛X!)
(不是1024核的电脑请把帧率调到10FPS!)、


5.
利用BitmapData类进行更高级的HITTEST!
[代码]
import flash.display.BitmapData;
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
onEnterFrame = function () {

var myBitmapData:BitmapData = new BitmapData(100, 100);

myBitmapData.draw(ar);

if (myBitmapData.getPixel(50, 50)<65280+5000 && myBitmapData.getPixel(50, 50)>65280-5000) {

trace("hit");

}

mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
};





恭喜你了,能看到这里不倒下来己经很强

你可能感兴趣的:(Flash,C,C++,C#)