精通BitmapData

一、构造方法:

var bmd:BitmapData=new BitmapData(200,100,true,0xffff0000);

参数说明:

1、宽

2、高

3、是否使用32位填充位图(包括alpha)

4、填充色。

 

 

二、属性(注意:所有属性都是只读

1、widht 宽

2、height 高

3、rect 矩形范围,即:Rectangle

4、transparent 透明度,即:是否使用32位填充。

 

 

三、方法

1、applyFilter():使用滤镜

applyFilter(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, filter:BitmapFilter):

参数说明:

sourceBitmapData:源位图数据,可以是当前bitmapData,也可以把别的bitmapData作滤镜处理后用于当前bitmapData.

sourceRect:源矩形,决定着对那一块区域使用滤镜。

destPoint:目标点,使用到目标位图数据后对滤镜区域进行坐标偏移。

filter:要应该的滤镜。

 

2、clone():BitmapData

返回一个新的 BitmapData 对象,它是对原始实例的克隆,包含与原始实例所含位图完全相同的副本。

 

3、colorTransform() :对位图数据进行颜色变化。

colorTransform(rect:Rectangle, colorTransform:ColorTransform):

 

4、compare(): 对两个位图数据进行比较。

compare(otherBitmapData:BitmapData):

说明:

1)要求两个位图数据的高、宽要一样,否则无法比较。

2)比较时红色跟红色比,绿色跟绿色比,蓝色跟蓝色比,请注意,他们的差值永远是正的,也就是要取绝对值。

3)比较的结果是返回一个新Object,需要强制转换为BitmapData

4)如果两个位图数据高、宽、颜色完全一样,则比较没有意义。生成的bitmapData=null.

5)上面的比较都在忽略alpha的基础上,如果两个位图数据有不同的alpha,比较可能变得更加复杂,不才经过几次测试后仍不能得到正确的答案。

 

5、copyChannel():拷贝通道;

copyChannel(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, sourceChannel:uint, destChannel:uint):

参数说明:

sourceBitmapData:源位图数据,当然可以去别的位图数据中拷贝通道。

sourceRect:源矩形,拷贝的范围。

destPoint:目标点,拷贝到目标位图数据后对坐标进行偏移。

sourceChannel:源通道,即:要拷贝的是哪一个通道。

destChannel:目标通道,即:要拷贝到目标位图数据的哪一个通道。

 注意事项,拷贝通道属于一种覆盖型拷贝而非叠加型拷贝,拷贝后目标通道的原有数据将被覆盖

下面是一种最简单的给图片去色的方法

bmd1.copyChannel(bmd1,bmd1.rect,new Point(),2,1);//把绿色通道拷贝到红色通道
bmd1.copyChannel(bmd1,bmd1.rect,new Point(),2,4);//把绿色通道拷贝到蓝色通道

注意,当三个通道的颜色信息值一样时,图片就变成灰色了。但这样做有一个缺点:它仅仅只是以一个通道为基准而对图片去色。更准确的去色方法请参考滤镜:ColorMatrixFilter () 颜色矩阵滤镜。

 

6、copyPixels() :拷贝象素。copyPixels(sourceBitmapData:, sourceRect:, destPoint:, alphaBitmapData: = null, alphaPoint: = null, mergeAlpha: = false):费话不想多说,最后三个参数搞不懂也

 

7、dispose() :释放内存。

 对此 BitmapData 实例的方法或属性的所有后续调用都将失败,并引发异常。

 

8、draw() :绘制数据。

draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):

参数说明:

source:要绘制的对象,几乎可以是所有的显示对象。当然,还可是以非显示类的bitmapData

matrix:使用矩阵,因为draw()方法不考虑对象的坐标,缩放,旋转的因素,所在需要使用matrix来达到移动,缩放,旋转等功能。

colorTransform:颜色变化。

blendMode:混合模式。

clipRect:要绘制的矩形区域。

smoothing:是否进行平滑处理,使用matrix后,对象可能会有锯齿,要求source是bitmapData是才有作用

 

9、fillRect() :给指定的矩形区域填充颜色。

fillRect(rect:Rectangle, color:uint)

 

10、floodFill() :倾倒填充

floodFill(x:int, y:int, color:uint)

说明:在坐标x,y处查找点并倾倒颜色,以该点相邻的且着色相同的全部被指定的color倾倒填充

 

11、generateFilterRect () :返回:Rectangle,得到滤镜后的矩形。

generateFilterRect(sourceRect:Rectangle, filter:BitmapFilter):Rectangle

参数:

sourceRect: 使用滤镜的矩形区域。

filter: 使用的滤镜。

说明:有些滤镜,比如模糊,使用后所影响到的区域要比原先的区域大一些,此时可以用此方法获得所影响到的区域。

 

12、getColorBoundsRect () :获得颜色区域。返回:Rectangle.

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

参数说明:

mask:颜色掩码。简单解释一下:最终查找的颜色是mask&color。即mask跟color的逻辑与运算,即转换为二进制后,相同数位都是1则才为1.所以,如果没有特别的要求,请把mask设置为0xffffffff.

color:要查找的颜色。

findColor:匹配颜色还是反向匹配颜色。如果该值设置为 true,则返回图像中颜色值的范围。 如果该值设置为 false,则返回图像中不存在此颜色的范围。

 

13、getPixel(x:int,y:int) :uint 和 getPixel32(x:int,y:int):uint;

获得某个像素的24位色或32位色。

 

14、setPixel(x:int,y:int) :uint 和 setPixel32(x:int,y:int):uint;

设置某个像素的24位色或32位色。

 

15、getPixels(rect:Rectangle):ByteArray 和 setPixels (rect:Rectangle, inputByteArray:ByteArray) :void

注意;这两方法最后有一个s,是复数,获得或设置某个区域的像素,第一个的返回值是ByteArray.

 

16、hitText() ;高级碰撞检测。

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

参数说明:

firstPoint:相对于当前bitmapData的坐标点。

firstAlphaThreshold:要检测的当前bitmapData的透明度,有效值是0—255,

secondObject:检测与哪一个对象发生碰撞,即:目标对象。

secondObject:目标对象的坐标点。

secondAlphaThreshold:目标对象的透明度。

注:关于hitText的更详细用法,请参考本Blog的相关文章

 

17、lock() 和 unlock()

若要提高性能,请在对 setPixel() 或 setPixel32() 方法进行多次调用之前和之后使用 loce() 方法及 unlock() 方法。

 

18、merge()  图像混合。

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

参数说明:

前三个参数:略:

第四、五、六、七个参数:

各通道的乘数,有效值0—255

例如,在红色通道中,新值是按如下方式计算的(其中 redSrc 是源图像中像素的红色通道值,而 redDest 是目标图像中对应像素的红色通道值):

new redDest = [(redSrc * redMultiplier) + (redDest * (256 - redMultiplier))] / 256;

从这个公式可以看出,最终的颜色是靠源颜色和目标颜色合成的,如果目标颜色占了80%的份量,那么源颜色只能占20%。另外,从公式还可以看出,如果原来的BitmapData的透明度是100%的话,设置alphaMultiplier显然变得毫无意义,但们最终的透明度仍然是100%.

 

19、noise():使用表示随机杂点的像素填充图像

noise(randomSeed:, low: = 0, high: = 255, channelOptions: = 7, grayScale: = false)

参数说明:

randomSeed:要使用的随机种子数。 如果您保持使所有其它参数不变,可以通过改变随机种子值来生成不同的伪随机结果。 杂点函数是一个映射函数,不是真正的随机数生成函数,所以它每次都会根据相同的随机种子创建相同的结果

low:要为每个通道生成的最低值(0 到 255)。 (最暗)

high:要为每个通道生成的最高值(0 到 255)。 (最亮)

channelOptions:一个数字,可以是四个颜色通道值(BitmapDataChannel.REDBitmapDataChannel.BLUEBitmapDataChannel.GREEN 和 BitmapDataChannel.ALPHA)的任意组合。 您可以使用逻辑 OR 运算符(|)来组合通道值。

grayScale:一个布尔值。 如果该值为 true,则会通过将所有颜色通道设置为相同的值来创建一个灰度图像。 将此参数设置为 true 不会影响 Alpha 通道的选择

 

20、paletteMap ()  :调色板

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

参数说明:

前三个参数不用多说,后四个参数分别的红、绿、蓝、透明通道的数据映射数组,如果省略在前的参数则需要传递null.

它们都是一组长度为256(0-255)的数组,用于存储每个通道的十六进制映射值,例:

var redArr:Array=[];
 var blurArr:Array=[];
 var greenArr:Array=[];
 for(var i:int=255;i>-1;i--){
  redArr.push(00<<24|i<<16|0<<8|00)
  blurArr.push(00<<24|0<<16|i<<8|00)
  greenArr.push(00<<24|0<<16|0<<8|i)
 }
 bmd1.paletteMap(bmd1,bmd1.rect,new Point(),null,blurArr,greenArr);

上面的代码能让图片颜色反转。

 

21、perlinNoise() :柏林噪音,能模拟云彩,瀑布等纹理。

perlinNoise(baseX:Number, baseY:Number, numOctaves:uint, randomSeed:int, stitch:Boolean, fractalNoise:Boolean, channelOptions:uint = 7, grayScale:Boolean = false, offsets:Array = null)

参数说明:

baseX 和 baseY :在X和Y轴方向生成的纹理大小。

numOctaves:数字八度音阶,作用是生成纹理的层数,注意:层数越多,图像越细腻,但渲染速度越慢。

randomSeed:伪随机种子:解释过好多遍了,相同的种子生成的纹理是相同的,所以说这样的纹理并不是真正意义上的随机。

stitch:一个布尔值。 如果该值为 true,则该方法将尝试平滑图像的转变边缘以创建无缝的纹理,用于作为位图填充进行平铺。

fractalNoise:Boolean — 一个布尔值。 如果该值为 true,则该方法将生成碎片杂点(即云彩效果);否则,它将生成湍流。 带有湍流的图像具有可见的不连续性渐变,可以使其具有更接近锐化的视觉效果,例如火焰或海浪。

channelOptions:uint (default = 7) — 一个数字,可以是四个颜色通道值(BitmapDataChannel.RED、BitmapDataChannel.BLUE、BitmapDataChannel.GREEN 和 BitmapDataChannel.ALPHA)的任意组合。 您可以使用逻辑 OR 运算符(|)来组合通道值。

grayScale:是否是灰度图像;

offsets:Array (default = null) — 与每个 octave 的 x 和 y 偏移量相对应的点数组。 通过操作这些偏移量值,您可以平滑滚动 perlinNoise 图像的图层。 偏移数组中的每个点将影响一个特定的 octave 杂点函数。(注意:这里的数组长度应该和数字八度音阶的层数相等,它们是一一对应的,用相同的伪随机种子,不断的改变offsets偏移量,再不断的使用该方法,纹理就会产生运动的漂亮效果

 

22、pixelDissolve () :像素溶解

pixelDissolve(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, randomSeed:int = 0, numPixels:int = 0, fillColor:uint = 0):int

参数说明:

sourceBitmapData:源位图数据:可以是当前位图,也可以是别的位图数据;

randomSeed:伪随机种子(特别需要提醒一下:访方法有一个返回值int,使用该方法的返回值作为种子将让你更“顺利”的完成溶解)。

numPixels:每次执行该方法能够溶解多少像素。

fillColor:溶解时用什么颜色的像素填充(仅限于sourceBitmapData是当前位图);

特别说明:怎样判断像素已经溶解完毕

用当前bitmapData的总像素除以numPixels(每次溶解的像素)=需要溶解的次数

但是这有一个非常重要的前提就是每次调用方法的种子必须是上次方法结束时返回的值,如:

var i:int=100;//刚开始可以随便给它一个种子

dissolve(i);//注意,这个方法需要用Timer类反复执行,执行的次数上面有述,次处不再重复

function dissolve(randomNum:Number):void {
    var rect:Rectangle = bmd.rect;
    var pt:Point = new Point(0, 0);
    var numberOfPixels:uint = 1000;
    i=bmd.pixelDissolve(bmd1, rect, pt, randomNum, numberOfPixels);//把方法执行的结果赋值给i
}

 

23、scroll(x,y) :滚动,又是一个做特效的好方法:

比如:下面是给一下BitmapData滚动两次后的效果:

bmd1.scroll(30,30);//X,Y轴同时滚动30个像素。也可以只滚动X轴或只滚动Y轴。
bmd1.scroll(30,30);//试试用enterFrame让它不停的滚动很小的像素。

精通BitmapData - mdzhg - 蜗牛的博客
 
 
posted @ 2013-09-12 16:41  tinytiny  阅读(283)  评论(0编辑  收藏  举报