`
小泥巴1024
  • 浏览: 22649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

绝对有用的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<i; 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<i; 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());
};





恭喜你了,能看到这里不倒下来己经很强
分享到:
评论
1 楼 mengxiaolongcz 2011-06-21  
D 代表背景色(0xXXXXXX是0x红红绿绿蓝蓝,如果C是true,就可以写为0xXXXXXXXX,就是0x红红绿绿蓝蓝ALPHA,注意是“零爱克斯XXXXXX”,不是“零哦XXXXXX”)


0xAARRGGBB 也就是0xALPHA红红绿绿蓝蓝 谢谢

相关推荐

    有用的类,绝对有用的类 有用的类

    "有用的类,绝对有用的类 有用的类" 这个标题暗示我们将探讨一些在实际开发中经常使用并且非常实用的类。这些类可能包含了处理各种任务的通用功能,能够提高我们的工作效率和代码的可维护性。 描述中的"处理,处理...

    普通java类获取绝对路径

    在Java编程中,获取类的绝对路径是一项常见的需求,特别是在集成开发环境中如Eclipse。这主要涉及到类加载器和文件系统交互的相关知识。下面将详细解释如何在Java中获取类的绝对路径,以及相关的概念和技术。 首先...

    android获取文件绝对路径类

    android获取文件绝对路径类,是本人项目中直接取出的类。在protected void onActivityResult()中使用

    Origin8.1经典教程(绝对有用)PPT课件.ppt

    Origin8.1经典教程(绝对有用),Origin8.1经典教程(绝对有用)PPT,Origin8.1经典教程(绝对有用)课件

    一个好用的分页类绝对好用绝对好用绝对好用

    绝对好用 绝对好用 绝对好用 绝对好用 绝对好用

    大整数类C++实现(绝对可用)

    大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++实现(绝对可用)大整数类C++...

    Oracle 实体类生成工具(亲测绝对管用)

    由于最近新开始做的项目使用的oracle 数据库,数据表的字段非常多,单个写又不现实,耽误时间,以前sql server 数据库就有工具能批量生成实体类,所以在网上费劲力气终于找了一个自动化的生成工具,共享出来,不为别...

    2010年人民银行计算机类真题整理版(绝对有用).pdf

    2010年人民银行计算机类真题整理版(绝对有用).pdf

    div+css 高度100% 绝对有用适应任何浏览器

    div+css 高度100% 绝对有用适应任何浏览器

    绝对收益产品系列报告(一):绝对收益类基金绩效特征及典型产品分析-0130-华宝证券-13页.pdf

    【绝对收益产品系列报告(一)】:绝对收益类基金绩效特征及典型产品分析 投资要点: 1. 绝对收益策略基金的目标客户群:这类基金主要针对的是那些期望稳定收益、对资产波动性敏感的投资者,如具有稳定负债的机构或...

    最完整的java方向毕业设计项目,内附完整代码,学习毕设绝对有用的东西!完成毕设只在朝夕之间 修改即用 竞赛获奖项目,毕业设计首

    最完整的java方向毕业设计项目,内附完整代码,学习毕设绝对有用的东西!完成毕设只在朝夕之间。修改即用。最完整的java方向毕业设计项目,内附完整代码,学习毕设绝对有用的东西!完成毕设只在朝夕之间。修改即用。...

    QT文件夹绝对路径定位

    根据给定的信息,本文将详细解释QT环境下如何实现文件夹的...通过以上分析可以看出,在QT开发中,利用`QDir`类和递归算法可以轻松实现文件夹绝对路径的定位功能。这对于文件管理和数据处理等应用场景来说是非常有用的。

    M70绝对位置设置说明.pdf

    《M70绝对位置设置说明》的文档详细阐述了如何在数控系统中设置绝对位置,以便设备无需每次启动时回归第一机械原点就能执行加工程序。这个过程涉及到多个参数设定和步骤,对于确保机床正常运行和高效加工至关重要。 ...

    thingsboard项目说明,绝对有用

    "thingsboard项目说明,绝对有用" ThingsBoard是一个基于Java的开源物联网(IoT)平台,旨在帮助开发者快速构建和部署IoT应用程序。下面是ThingsBoard项目框架的详细说明: 项目框架整理说明 ThingsBoard项目...

    程序定义绝对地址方法

    程序定义绝对地址方法 本文档主要介绍了在 IAR 编译器中定义程序绝对地址的方法,实现程序的模块化更新。通过将函数和变量绝对定位在特定的内存地址,可以实现固件的模块化更新,减少了更新固件的大小和复杂度。 ...

    1153 绝对素数.cpp

    1153:绝对素数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 17292 通过数: 10200 【题目描述】 如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13。试求出所有二位绝对素数。 ...

    摄影测量与遥感:解析法绝对定向.ppt

    解析法绝对定向 模型的绝对定向:把模型点在像空间辅助坐标系的坐标转化为地面测量坐标。 描述立体像对在摄影瞬间的绝对位置和姿态的参数称绝对定向元素。 通过将相对定向模型进行缩放、平移和旋转,使其达到绝对...

    考博万能作文模板,绝对有用

    这类作文主题通常涉及对某一问题的两种或多种看法。模板提供了一个清晰的结构,使考生能够分别阐述并比较不同的观点,最后给出自己的立场。 开头部分:提出普遍关注的问题,并引出观点差异。 主体段落一:介绍...

    c++答案绝对有用,非常有用

    c++答案,绝对能帮得上你,若果你下了就是绝对有用,希望能帮得上你

    如何将相对路径转化为绝对路径

    使用C#可以使用`System.Uri`类和`HttpContext`类来实现将相对路径转化为绝对路径。下面是一个示例代码: ```csharp public static string BuildAbsolute(string relativeUrl) { System.Uri uri = HttpContext....

Global site tag (gtag.js) - Google Analytics