·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3中的BitmapData类理解与介绍(4)

时间:2013-08-08 00:09cuplayer
13,获取颜色区域 getColorBoundsRect(mask:uint, color:uint, findColor:Boolean= true):Rectangle 这个在做摄像头应用的常用来检测颜色的区域。返回的是由所有符合条件的像素组成的 最大矩形 。 color:就是要查

13,获取颜色区域

getColorBoundsRect(mask:uint, color:uint, findColor:Boolean = true):Rectangle

这个在做摄像头应用的常用来检测颜色的区域。返回的是由所有符合条件的像素组成的最大矩形

color:就是要查找的颜色

findColor:为true时,是查找与color相同的颜色;为false则是查找与color不相同的颜色。

mask:是一个与输入color的掩码操作,作用是例如我只想进行某个通道的颜色比对时,可以不必管其他通道的的具体值。具体的运算方法是&(按位 AND),即逻辑与或非中的“与”操作,具体的结果是1&1=1,1&0=0&1=0&0=0,是二进制下的运算。

至于怎么比对?其实0xF = 二进制下的1111,类似的转化而已。

14,取得某点颜色(16位版)

getPixel(x:int, y:int):uint

很简单,就是取得x,y点的颜色(不包含Alpha通道)。

15,取得某点颜色,(32位版)

getPixel32(x:int, y:int):uint

同上,不过这次包含了Alpha通道

16,取得区域的像素二进制信息

getPixels(rect:Rectangle):ByteArray

这个函数是将一片区域rect内的所有图形信息,打包成一个二进制数组类ByteArray,作用是可以在头像上传时上传用户选择的部分。二进制数组类ByteArray也是一个高级的类,以后会有介绍。

17,获取区域内的像素矢量数组Vector

getVector(rect:Rectangle):Vector.<uint>

Vector 这种数据结构是FP10以后新加的,那么这个方法对应的也只能在FP10或以上版本里使用。学过Java的同学可能很熟悉,其实Vector是一种固定数 据类型的数组。即这个数组里的所有内容都必须是某种数据类型的。这样做的好处是因为事先规定好了数组的类型,那么在使用时不用花时间去判断弱类型,大大提 高了运行效率,其他的使用方法大概跟Array一样。

那么这个函数其实没有太多的难点,就是返回一个Vector,里面包含的都是每一个像素的颜色信息而已。

18,获取区域内通道信息矢量数组Vector

histogram(hRect:Rectangle = null):Vector.<Vector>

这个也是FP10的新API,具体作用跟getVector很像,只是将getVector的结果继续拆分了而已。

返回的Vector里面有4个Vector,4个Vector里面装的是4个通道(Alpha,Red Green,Blue)的值0~255。再巩固一下Vector是有类型的数组,所以返回的是Vector.<Vector>,而4个Vector则是Vector.<Number>。

19,不规则碰撞检测(高级碰撞检测)

hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

详细的介绍可以参考《ActionScript Animation》,中文译名好像就Flash高级动画教程还是啥的,封面是个长颈鹿的··这本书挺出名的···

这里转一些介绍(其实配合上调用函数的对象,是6个参数)高手介绍的比我清楚得多:

注意到这5个参数被分成了两组:一个和另一个。每组都需要一个点来确定位图的左上角起点。

接着每组都还有一个透明阈值。之前提到过,支持透明的位图对象,每个像素的透明度取值范围在0(完全透明)到255(完全不透明)。参数透明阈值即指定, 透明度在多少的时候就算碰撞。

最后还剩一个参数,另一个对象。注意它的类型是Object。允许传递的可以是一个点(Point),一个矩形(Rectangle)或者另一个位图对象 (BitmapData)。如果传一个点或者一个矩形,那么后面的两个参数可以忽略。

到 此,测试都是围绕着Bitmap对象。而大多情况下的MovieClip,Sprite和Shape对象是没法用hitTest的。有个办法就是暗中准备 一些BitmapData,不把它们加入到显示列表。当要对两个显示对象进行碰撞检测时,先把它们分别绘制到一个准备好的位图对象中,然后如法炮制。要知 道,这不是唯一的办法,却是个不错的办法。

20,锁定变化

lock():void

因为对像素的操作涉及很多中间步骤,如果每操作一次都更新一次,那么如此大的计算量会把CPU拖垮的,这个函数的作用就是把BMD锁住,只保存更新步骤,而不更新实际像素。在做粒子效果时如果没有这一步绝对卡死人。

21,图像合并

merge(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, redMultiplier:uint, greenMultiplier:uint, blueMultiplier:uint, alphaMultiplier:uint):void

头三个参数又是老三样,不多说。

后面的4个参数分别是AARRGGBB通道Multiplier

计算方法为新值=Source通道*Multiplier;

22,生成噪点

noise(randomSeed:int, low:uint = 0, high:uint = 255, channelOptions:uint = 7, grayScale:Boolean = false):void

生成一堆杂乱无章的图像填充BMD,意义何在??一般是做贴图的MAP映射吧···创造出凹凸不平的效果,一般很少人会直接用吧···

randomSeed:随机的一个种子,就是从这个数字生成一大堆噪点图

low,high各通道在0~255区间取的最低和最高值

channelOptions:uint (default =7) — 一个数字,可以是四个颜色通道值的任意组合。 您可以使用逻辑 OR 运算符(|)来组合通道值。 (谁看的懂谁告诉我···我是不知道他想怎样了)

grayScale:这个如果设为true,则生成像素的RGB值将相等,即生成“灰度图”。如果是false则是为有色彩的。

23,调色板

paletteMap(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, redArray:Array= null, greenArray:Array = null, blueArray:Array = null, alphaArray:Array = null):void

这个API在摄像头检测中有很重要的应用,回想刚刚的getColorBoundsRect(不用回想了,如果你能看 一次就记住才有鬼了,还是拖上去看看吧),:D,检测一个0xRRGGBB的颜色?见鬼!256x256x256=16777216种颜色,才定义其中一 种??除非是我自己填的,不然找啥啊~~

paletteMap函数的作用就是重新映射各个通道的范围,例如你可以把Red通道的颜色区间从原来的256种红映射成16种红,大大提高了你的检测成功率。

头三个参数还是老三样(我发现这句都成我口头禅了,哈)。不多说。

后面4个参数其实是一类的,四个通道AARRGGBB。

那么我们应该输入什么进这些数组呢·?答案是256长度的内容,对应各个通道的256个值,但是这个值是我们来定义的。

这 里注意的是,由于最后的颜色是四个通道相加出来的,所以redArray的值应该是0x00000000~0x00FF0000,要将具体的值移位到正确 的位置上。这里介绍两个大家平常很少用的二进制位操作符<<和>>,作用就是将二进制数全部向左或者向右移一位。

只要按你想要的把4个数组的映射保存好,作为参数传入就可以了。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器