Flash8 BitmapData使用(转)

     Macromedia Flash8 Image API 描述了一个的新的actionscirpt class类BitmapData 以及与其相关的各式各样的方法所带来的新的特性。这些新的方法使flash开发人员通过Actionscript在运行时创建并操作32位图像。这些Image Api非常类似于macromedia的产品Director中的lingo api.然而在flash8 的image api更细致准备,有更强的功能。在这篇文章中,我们将来研究如何开始使用Image Api并讨论它的一些能力。

在Actionscript 中使用Bitmaps


      新的BitmapData 类用来描述在内存中的bitmap对象,当你创建一个新的类实例时,一个空的图像就已经保存在内存中了,你可以使用BitmapData类所提供的各种方法来操作这个原始的bitmap.在你开始应用BitmapData类之前,你需要先了解一个关于bitmaps的前前后后。
    Bitmap是一个数字格式图形,它使用色彩数据网格来描述一张图像,在网格中的每一个单元格代表一个像素,每一个像素是都是由指定的色值渲染成的一个图像。Bitmap在flash player中被保存成32位色彩深度。这意味着每一个被指定了色彩的像素都是以二进制数保存,它的长度为32bit.在32位图像中的一个像素的颜色它可能只是16.7万色中的一种。每一种颜色又是由四种颜色通道如红,绿,蓝和alpha通道组成。

16进制颜色值

         在Actionscript中与BitmapData类相关联的颜色值是以32位的十六进制数形式表示的。一个32位的十六进制数包含了4个十六进制数对,每一对是两个数。每一对十六进制数定义4色通道(红,绿,蓝,alpha)之中一种通道的强度,每一个颜色通道的强度是一个十六进制数,强度范围是0-255的十进数,FF代表最强(255),00代到在这个通道中没有颜色(0)。正如你所看的,每一个通道是两个数的长度,例如是01而不能写成1,这样确保在一个十六进制数中你总是有8个数,同时不要忘记需要加上十六进制数的前缀0x,例如纯白色用十六进制表示为0xFFFFFFFF。黑色正好相反,在红,绿蓝三个通道中都没有颜色所以我们写成0xFF000000。注意alpha通道,在十六进制数对中,它是第一对,它仍处于最强状态,alpha通道为FF为最强状态意味着没有alpha,也就是说完全不透明,00意味着完全alpha,也就是说完全透明。所以一个透明像素的颜色值为0x00FFFFFF。

ARGB转换为十六进制值

        在通常情况下大多数人熟知的颜色值是ARGB格式也说每个值都使用的是0-255之前的数值,如果是这样,你需要知道如何将ARGB值转换为十六进制值,下面的代码告诉你如何来转换它们:

演示文件:


如下代码:
as 代码
  1. function argbtohex(a:Number, r:Number, g:Number, b:Number)    
  2. {    
  3.     return (a<<24 | r<<16 | g<<8 | b)    
  4. }   

使用方法:
as 代码
  1. hex=argbtohex(255,0,255,0)  


十六进制转换为ARGB值

演示文件:


要将十六进制值转换为ARGB十进制形式,使用下面的代码:
as 代码
  1. function hextoargb(val:Number)    
  2. {    
  3.     var col={}    
  4.     col.alpha = (val >> 24) & 0xFF    
  5.     col.red = (val >> 16) & 0xFF    
  6.     col.green = (val >> 8) & 0xFF    
  7.     col.blue = val & 0xFF    
  8.     return col    
  9. }   

使用方法:
as 代码
  1. argb=hextoargb(0xFFFFCC00);    
  2. alpha=argb.alpha;    
  3. red=argb.red;    
  4. green=argb.green;    
  5. blue=argb.blue;   


使用actionscirpt创建Bitmap
在actionscrpt运行创建bitmap,需要我们先创建bitmap类实例,如下代码:
as 代码
  1. myBitmap=new flash.display.BitmapData(width,height,transparent,fillColor)  

Bitmap类存在于flash.display类包中,为了减少我们的输入量,在创建类实例时可以先导入类,如下代码:
as 代码
  1. import flash.display.BitmapData;  

然后你就可以创建bitmap类的实例了,如下代码: 
as 代码
  1. var myBitmap = new BitmapData(width,height,transparent,fillcolor);   

        BitmapData类构造函数接收四个参数分别是width(宽),height(高),transparent(透明度)和fillcolor(添充色)。Width和height用来指定所创建的bitmap的大小,如果你把bitmap想象为一个网格,那么宽就是水平方向的像素个数,高就是垂直方的像素个数。Tansparent是一个布尔值(true/false),它用来指定你是否打算让bitmap包含透明。Fillcolor参数用来指定在bitmap中每个像素的32位颜色。然而,如果你设置你的transparent值为false,那么前8bit所指定的颜色就会被忽略,因为在那种情况下就没有必要在传输32位的十六进制数了。取而代之的是,你可以传传输24位的十六进制数如0xFFFFFF的白色像素。Transparent和fillcolor两个参数是可选参数,如果你忽略他们,那么在内存中的bitmap就不会有透明并且每个像素都默认是白色如0xffffffff.
      例如,你要创建一个黑色的100*100大小的,完全不透明的bitmap. 你需要用到如下代码:
as 代码
  1. import flash.display.BitmapData;    
  2. myBitmap = new BitmapData(100,100,false,0Xff00000000);  

注意:bitmap在flash player的限制大小为2880像素,如果你想创建超过这个大小的bitmap,那么bitmap是不会被创建的。因为创建超过限制大小的bitmap的会吞掉许掉客户端的RAM.

      一旦你创建完了bitmapData 类的实例,你就有了众多的bitmapData方法可以使用,用来操作你的bitmap。例如,你可以指定滤镜效果,添充色彩,编辑色彩,使某个区域透明等等,可能性是无穷的。然而在这篇文章中我们主要研究一些基础的内容,帮助你开始,并发现。

清除BitmapData

       一个BitmapData对象实例可以很快的吃掉访问者的内存,bitmap中的每个像素都要使用内存中的4个字节来保存。如果你创建的bitmap有500*500的大小,它将消耗掉1M左右的内存,如果你不在需要一个Bitmap对象,那最好的习惯是释放Bitmap所使用的内存,BitmapData提供了一个方法,帮你处理此事,dispose()方示,你只需要如下操作:
as 代码
  1. myBitmap.dispose();   


记得要在你不使用BitmapData时,清掉bitmapData.以释放内存。

显示图像

     一个BitmapData类的实例保存在内存中,它是不可见的直到你决定是时候让它显示时,你需要将bitmap贴加(attche)到舞台(stage)上以使它可以被渲染。你可以使用方法MovieClip.attachBitmap让BitmapData对象显不在任何movieclip当中。
as 代码
  1. import flash.display.BitmapData;    
  2. myBitmap = new BitmapData(100,100,false,0Xff000000);    
  3. this.createEmptyMovieClip(“holder_mc”,1);    
  4. holder_mc.attachBitmap(myBitmap,1);  


     创建一个空的影片剪辑来显示bitmap是一个不错的主意,当你贴加bitmap到你的影片剪辑中时,是没有方法移除的,而如果你单独创建了一个空影片剪辑用来显示bitmap,那么你在不需要时可能通过移除movieclip来移除bitmap.
如下代码:
as 代码
  1. holder_mc.removeMovieClip();   

当你贴加bitmap到影片剪辑时,你对bitmapData的任何修改,影片剪辑中的bitmap都会自动的更新,你不需要每次都重新贴加。

快照

       BitmapData类有一个非常好的特性是它可以对任何动态的视觉元素做快照生成一个bitmap实例,如影片剪辑,video对象,文本域,这种特性可以让我们针对流式视频,摄像头或影片剪辑制作出一系列的静帧。
从一个movieClip或舞台上的其它实例对象创建bitmap,你需要使用BitmapData的draw()方法。默认情况下,这个方法绘制一个表现对象当前状态并且没有进行任何变形的bitmap,这意味着如果你正在获取一个视频对象的快照,视频对象发生了旋转,但是创建出来的bitmap是没有被旋转的。我们将在后面讨论它的细节。
         现在,我们把精力完全集中在BitmapData.draw()方法上,从它的简单结构上看,这个方法只是用矢量渲染来绘制指定对象的bitmap.这个方法还可以用来指定融合模式给一个bitmap或是通过ColorTransform类来计算颜色的bitmap.
例如,假设你有一个movieclip对象存在于场景中名称为animation_mc,在它的内部有一些矢量动画。当在动画时,你可以获取到当前动画状态的bitmap.如下代码:
as 代码
  1. import flash.display.BitmapData;    
  2. myBitmap = new BitmapData(animation_mc._width,animation_mc._height,true,0x00ffffff);    
  3. myBitmap.draw(animation_mc);   

变换矩阵

       在flash8中增加了一个新的Matrix ActionScript类它可以把我们从创建变换矩阵的困难中摆脱出来。一个变换矩阵是一个3行*3列的数字,它反映的是从一个位置到哪一个的点阵图。使用变换矩阵,你可以在同一时间内进斜切,旋转,缩放和移动bitmap或是movieclip.仔细讨论Matrix 类已经超出了此文的范围。这里将介绍给你Matrix 类的一些方法,以满足你的日常应用。它是draw()方法中的第二个参数。
要创建变换矩阵,需要你先导入Matrix类,matrix类存在于flash.geom类包中。如下代码:
as 代码
  1. import flash.geom.Matrix;  

然后你就可以创建Matrix类实例:
as 代码
  1. m= new Matrix();  

      这样我们就创建了一个默认单位矩阵,当指定给对象时,矩阵并没有改变对象的缩放,旋转,斜切和位置。
当你创建了一个矩阵之后,你可以使用矩阵所带的各种方法来编辑对象的属性和指定各种变换给对象。
      你可以使用Matrix.scale()方法来编辑矩阵,当它指定给对象时,它就会针对对象进行缩放。例如,创建一个变换矩阵它将缩放对象到它之前两倍的大的大小,使用下面的代码:
as 代码
  1. import flash.display.Matrix;    
  2. m = new Matrix();    
  3. m.scale(2,2);   

      如果当你在变换矩阵时你想旋转你的对象,那么你可以使用Matrix.rotate()方法。这个方法接受弧度。要将旋转角度值转换弧度你需要用到下面的简单的数学方法:
as 代码
  1. radians =(degree/180)*Math.PI;   

下面代码编辑变换矩阵,当你将这段代码应用到对象时,它将旋转对象45度。
as 代码
  1. .rotate((45/180)*Math.PI);   

      要移动一个指定了矩阵的对象,你可以使用Matrix.translate()方法,当你指定给一个对象时,对象就会显示在指定位置上。
as 代码
  1. m.translate(100,100)   

      现在你已经有了一个矩阵,当它指定给一个对象时,缩放到对象的两倍大小,旋转45度,并设定它的位置为x=100,y=100.

变换快照

          我们注意到之前我们提到的BitmapData.draw()方法接受一个变换矩阵做为第二参数。这使得你可以获取屏幕上的对象的快照,并且可能通过matrix对它进行编辑。
当你获取到一个影片剪辑的快照,在默认状态绘制的快照是没有应用过任何变换的。这意味着如果你旋转了场景中的movieclip并且缩放它的大小,但是快照并不会旋转或是缩放。然而,如果你指定了变换矩阵作为matrix.draw()的第二个参数,那么你就可以将上述的这些变换应用到绘制出来快照bitmap上。
当你缩放,旋转或是使用Actionscripta移动一个影片剪辑时。在flash player内部是使用变换矩阵来显示movieclip的正确位置。在flash8 播放器中你可以使用Movieclip.transform.matrix属性访问低级变换矩阵,这个属性返回正确变换值的Matrix类的实例。你可以使用这个属性来决定哪一种变换被应用到影片剪辑上。你还可创建与另一具有相同变换的影片剪辑。如下代码:
as 代码
  1. Movieclip1.transform.matrix=movieclip2.transform.matrix   

       下面的代码创建了一个包含square三角块的影片剪辑,使用Actiosncript对它进行缩放和旋转。如下代码:
as 代码
  1. import flash.display.BitmapData    
  2.   
  3. this.createEmptyMovieClip("square_mc",1)    
  4. //绘制一个黄色的矩形    
  5. with(square_mc)    
  6. {    
  7.     beginFill(0xFFCC00)    
  8.     lineStyle(1,0x000000)    
  9.     lineTo(0,100)    
  10.     lineTo(100,100)    
  11.     lineTo(100,0)    
  12.     lineTo(0,0)    
  13.     endFill()    
  14. }    
  15. //旋转矩形方块    
  16. square_mc._rotation=45    
  17. //缩放两倍    
  18. square_mc._xscale=square_mc._yscale=200  

      如果你要获取上面影片剪辑的快照,这个三角形bitmap不会被旋转和缩放,除非你指定了matarix变换。如果你想让这个矩形影片剪辑在bitmap中呈现出与场景中一样的状态,你需要指定影片剪辑的变换矩阵做为draw()方法的第二个参数。
如下代码:
as 代码
  1. //创建一个透明的bitmapData.它的大小与三角形相同    
  2. myBitmap =new BitmapData(square_mc._width,square_mc._height,true,0x00FFFFFF)    
  3.   
  4. //绘制出与场景中相同大小的三角形bitmap 快照。    
  5. myBitmap.draw(square_mc,square_mc.transform.matrix)   

       如果你不想让绘制的影片剪辑与场景中的一模一样,例如你可能想让bitmap的大小是movieclip大小的一半,你可以访问影片剪辑的变换矩阵编辑它,当它指定给对象时,你所做的编辑就会生效:
如下代码:
as 代码
  1. myBitmap = new BitmapData(square_mc._width/2,square_mc._height/2,true,0x00FFFFFF)    
  2. //获取影片剪辑的变换矩阵    
  3. m=square_mc.transform.matrix    
  4.   
  5. //编辑影片剪辑的变换矩阵    
  6. m.scale(0.5,0.5)    
  7. //快照影片剪辑    
  8. myBitmap.draw(square_mc,m)   
使用载入的图像

       直接载入外部文件如(jpeg,gif,png或是flash影片)做为BitmapData类的实例是不可能的事情,你能做的就是将这些外部文件载入到一个影片剪辑中,当它载入完成后,然后你才能对影片剪辑应用bitmap快照。
as 代码
  1. import flash.display.BitmapData;    
  2. //创建holder_mc用来载入外部文件    
  3. this.createEmptyMovieClip("holder_mc", this.getNextHighestDepth());    
  4. //创建show_mc用来显示bitmap    
  5. this.createEmptyMovieClip("show_mc",this.getNextHighestDepth());    
  6. //使用moviecliploader载入外部图片    
  7. loader = new MovieClipLoader();    
  8. //侦听主时间轴    
  9. loader.addListener(this);    
  10. //载入外部文件可以是png,gif,jpeg,swf    
  11. loader.loadClip("flower.jpg", holder_mc);    
  12. //定义onLoadInit事件    
  13. function onLoadInit() {    
  14.     //创建bitmap类实例    
  15.     myBitmap = new BitmapData(holder_mc._width, holder_mc._height, true, 0x00FFFFFF);    
  16.     //bitmap快照    
  17.     myBitmap.draw(holder_mc);    
  18.     //移除没有用的holder_mc    
  19.     holder_mc.removeMovieClip();    
  20.     //显示bitmap    
  21.     show_mc.attachBitmap(myBitmap,this.getNextHighestDepth());    
  22. }    
  23. //定义载入出错事件    
  24. function onLoadError(){    
  25.     holder_mc.removeMovieClip();    
  26. }   

应用滤镜

        完全讨论滤镜超出了这篇教程的范围。然而通过图片为了减少锯齿或是硬边,我们一般情况要针对图像就用模糊,因此我们来看如何针对bitmap应用滤镜。你可以使用BitmapData.applyFilter()方法直接对bitmap应用各种各样的滤镜,Flash player支持各种滤镜如Displacement,Blur,Glow,DropShadow,和Bevel.你可应用所有的滤镜到bitmap中的一个矩形区域或是整个bitmap对象。下面的代码针对从库中载入的bitmap应用模糊滤镜。如下代码:
as 代码
  1. import flash.display.BitmapData;    
  2. import flash.filters.BlurFilter;    
  3. //使用loadBitmap方法载入库中的图像    
  4. myBitmap = BitmapData.loadBitmap("flower");    
  5. //定义模糊滤镜    
  6. blur = new BlurFilter(10, 10, 5);    
  7. //应用滤镜    
  8. myBitmap.applyFilter(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,blur);    
  9. //创建holder_mc用来显示bitmap    
  10. this.createEmptyMovieClip("holder_mc", 0);    
  11. holder_mc.attachBitmap(myBitmap, 1);   

       ApplyFilter()方法的第二个参数可以让你在指定的矩形区域上应用滤镜,在上面的例子中,我们使用的是bitmap的rectangle属性,它返回的是flash.geom..Rectangle类实例,它的大小就是图像的大小,因此我们可以对整个图像应用滤镜。然而,在你需要的时候你可以改这这个矩形区域的大小来指定滤镜,你需要创建一个Rectangle类的实例并将它传给applyFilter方法做为第二个参数。如下代码:
as 代码
  1. import flash.display.BitmapData;    
  2. import flash.filters.BlurFilter;    
  3. import flash.geom.Rectangle;    
  4. import flash.geom.Point;    
  5. //使用loadBitmap方法载入库中的图像    
  6. myBitmap = BitmapData.loadBitmap("flower");    
  7. //定义模糊滤镜    
  8. blur = new BlurFilter(10, 10, 5);    
  9. rectangle = new Rectangle(50,50,200,100);    
  10. //应用滤镜    
  11. myBitmap.applyFilter(myBitmap,rectangle,myBitmap.rectangle.topLeft,blur);    
  12. //创建holder_mc用来显示bitmap    
  13. this.createEmptyMovieClip("holder_mc", 0);    
  14. holder_mc.attachBitmap(myBitmap, -1);    

       当你针对整个bitmap应用滤镜时,最终结果的bitmap可能要大于源图bitmap,例如,DropShadow滤镜要在bitmap四周增加像素.这使得生成的bitmap图像大于源bitmap图像,假设我们应用DropShadow滤镜到一个100像素宽高的bitmaph 上,它的距离是20像素45度角,当应用完滤镜后,结果的bitmap图像会超出16像素的大小,但是在这之前你并不清楚,只到你创建完bitmap对象之后,可能才会发现,当BitmapData对象创建完成后你是无法去修改它的。
还好有一种方式可以让你在应用滤镜之前决定最终bitmap的大小,因此你可以根据它来定义你的最终bitmap的大小。
as 代码
  1. import flash.display.BitmapData;    
  2. import flash.filters.DropShadowFilter;    
  3. //使用loadBitmap方法载入库中的图像    
  4. myBitmap = BitmapData.loadBitmap("logo");    
  5. //定义模糊滤镜    
  6. dropShadow = new DropShadowFilter(5,45);    
  7. //查看应用滤镜后bitmap的大小    
  8. filteredSize = myBitmap.generateFilterRect(myBitmap.rectangle, dropShadow);    
  9. trace(filteredSize);    
  10. //如果左上角为负数,你需要增加宽和高    
  11. w = (filteredSize.x<0) ? filteredSize.width-filteredSize.x : filteredSize.width;    
  12. h = (filteredSize.y<0) ? filteredSize.height-filteredSize.y : filteredSize.height;    
  13. //    
  14. fillColor = (myBitmap.transparent) ? 0x00FFFFFF : 0xFFFFFFFF;    
  15. //创建一个新的Bitmap用来存应用滤镜后的bimap    
  16. filteredBitmap = new BitmapData(w, h, myBitmap.transparent, fillColor);    
  17. //对载入的bitmap应用滤镜    
  18. filteredBitmap.applyFilter(myBitmap, myBitmap.rectangle, myBitmap.rectangle.topLeft, dropShadow);   


获取像素的颜色

       你可以获取到bitmap中的任意像素的颜色,使用BitmapData.getPixel()方法可以返回以十进制式表示的指定x/y位置的RGB颜色值
as 代码
  1. import flash.display.BitmapData;    
  2. myBitmap = new BitmapData(100,100,false,0xFFCC00);    
  3. pixelColor = myBitmap.getPixel(50,50);    
  4. trace(pixelColor);   


要获得16进制格式表示的数值,们可以使用toString()方法:
as 代码
  1. trace("0x"+pixelColor.toString(16)) //输出为 : 0xffcc00   

       然而,你可能会现,当我们使用getPixel()方法处理包含alpha通道(BitmapData.transparent==true)的bitmap时,你可能会获得意想不到的结果.
BitmapData.getPixel32()方法返回基于十进制表示的指定x/y位置的ARGB像素颜色值。这种方法也会返加alpha通道的数据与getPixel()不同。
as 代码
  1. import flash.display.BitmapData    
  2. myBitmap = new BitmapData(100,100,true,0x11FFCC00)    
  3. pixelColor=myBitmap.getPixel32(50,50)    
  4. trace("0x"+pixelColor.toString(16)) //outputs : 0x11ffd200   

设置像素颜色

      要设置像素颜色,你可以使用BitmapData.setPixel()方法。这个方法可以改变指定了x/y位置的像素颜色值。你指定的颜色是以24bit的十六进制形式表现的如0xFFCC00,alpha通道字节将被忽略。
as 代码
  1. myBitmap = BitmapData.loadBitmap("photo")    
  2. //增加1000个像素    
  3. for(i=0;i<1000;++i)    
  4. {    
  5.     //generate two random x/y co-ordinates    
  6.     rx1=Math.floor(Math.random()*myBitmap.width)    
  7.     rx2=Math.floor(Math.random()*myBitmap.width)    
  8.     ry1=Math.floor(Math.random()*myBitmap.height)    
  9.     ry2=Math.floor(Math.random()*myBitmap.height)    
  10.     //设置随机的像素颜色为其它的像素的颜色。    
  11.     myBitmap.setPixel(rx1,ry1,myBitmap.getPixel(rx2,ry2))    
  12. }   

        对于当前这个方法你只能用在不包含alpha透明通道(BitmapData.transparent)的图像上,否则你需要使用BitmapData.setPixel32()方法。SetPixel32()方法可以使你指定包含alpha通道数据的32位十六进制数据。
as 代码
  1. myBitmap.setPixel32(50,50,0xFFFFCC00)   


设置像素组颜色

        你可以使用fillRect()方法为一个矩形区域内的像素指定颜色。这个方法通常会用在还原最初bitmap块的颜色。因为你可以添充整个bitmap块的颜色,比擦除的效率要高的多。
     这个方法的第一个参数是你想要添充的矩形区域。它是flash.geom.Rectangle类的实例。第二个参数是你想要改变的颜色。
要指定一个矩形区域,首先要先导入Rectangle类,Rectangle类存在于flash.geom.类包中: 
as 代码
  1. import flash.geom.Rectangle;    
  2. myRect = new Rectangle(0,0,100,100);   

       前两个参数是矩形的左上角x/y的位置,后两个参数是矩形的宽和高,你可以添充一个指定的颜色在矩形区域内。
如下代码:
as 代码
  1. myBitmap.fillRect(myRect,0xFFFF0000);   

     注意每一个BitmapData类都有一个返回bitmap对象大小和位置的属性。Bitmap对象的位置总在处在0,0的位置,因此它最有用的地方是供bitmap类的方法用来检测位置。这个属称为BitmapData.rectangle它返加一个Rectangle 类实例。
as 代码
  1. //使用绿色添充整个bitmap.    
  2. myBitmap.fillRect(myBitmap.rectangle,0xFF00FF00);   


改变颜色范围

      对你来说可能还有一件最复杂的事就是循环出每一像素的颜色然后改变它为其它颜色,如果你发现你需要改变颜色的位置是在同一色系的范围内,那么你不需要循环出每一像素的颜色,你可以使用BitmapData.threshold()方法,你可以分离和替换在同一色域范围内像素颜色。例如你想要一张图像上的所有红色像素透明,你可以使用下面的代码:
as 代码
  1. import flash.display.BitmapData    
  2. import flash.geom.Rectangle    
  3. //创建一个100*100大小的添充红色像素的bitmap    
  4. myBitmap = new BitmapData(100,100,true,0xFFFF0000)    
  5. //定义一个20*20大小的矩形.位于bitmap对像的中心位置    
  6. centeredRectangle=new Rectangle(40,40,20,20)    
  7. //用黑色像素添充矩形区域    
  8. myBitmap.fillRect(centeredRectangle,0xFF000000)    
  9. //改变bitmap上所有像素为红色并且透明.    
  10. redPixelCount=myBitmap.threshold(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,"==",0xFFFF0000,0x00FFFFFF)   

BitmapData.threshold()方法返回是受影响的所有像素点的数值。
as 代码
  1. trace(redPixelCount);//结果应是9600  

你可以通过threshold来改变操作结果,threshold有四个参数:
as 代码
  1. >    
  2. ==    
  3. !=    
  4. <    
  5. <=    
  6. >=   

上面的打操作参数用于测试阈值的.你可以通过帮助文档来查看threshold,你还可以这样.如下:
as 代码
  1. myBitmap.threshold(myBitmap,myBitmap.rectangle,myBitmap.rectangle.topLeft,"!=",0xFFFF0000,0x00FFFFFF)   

操作的结果与”==”的结果正是相反的.

复制像素

        复制像素在我们的图像操作中是常用的.你可以使用BitmapData.copyPixels()从一个bitmap复制像素到另一个bitmap.这个方法从源bitmap复制你指定的矩形区域的像素到目标bitmap.你还可以使用一张带有alpha通道的图像做为遮罩来进行复制操作,这可以使用所复制的不是矩形而是一个区域。
下面的例子复制一个矩形区域从一个bitmap到另一个bitmap.
as 代码
  1. import flash.display.BitmapData    
  2. import flash.geom.Rectangle    
  3.   
  4. //贴加一第图像到bitmap中    
  5. myBitmap = BitmapData.loadBitmap("logo")    
  6.   
  7. //定义一个复制像素的区域    
  8. area=new Rectangle(10,10,50,50)    
  9.   
  10. //创建一个新的bitmap用来存放复制后的像素    
  11. bitmapSlot=new BitmapData(50,50)    
  12.   
  13. //开始复制像素    
  14. bitmapSlot.copyPixels(myBitmap,area,bitmapSlot.rectangle.topLeft)   

下面的这个例子是使用包含有一个圆形透明区域用做alpha遮罩来复制圆形区域的像素到另一个bitmap.
as 代码
  1. import flash.display.BitmapData    
  2. import flash.geom.Rectangle    
  3. import flash.geom.Matrix    
  4.   
  5. //从库中加载图像bitmap    
  6. myBitmap = BitmapData.loadBitmap('logo')    
  7.   
  8. //在影片剪辑内绘制一个园形    
  9. this.createEmptyMovieClip('mask_mc',1)    
  10. mask_mc.lineStyle(75,0x00FF00)    
  11. //绘制的圆的直径是75    
  12. mask_mc.lineTo(0,1)    
  13. //创建一个新的bitmap,注意要保有透明alpha通道    
  14. maskBitmap = new BitmapData(100,100,true,0x00FFFFFF)    
  15. //创建一个matrix    
  16. m=new Matrix()    
  17. //改变绘制的位置    
  18. m.translate(50,50)    
  19. //在bitmap中绘制圆形    
  20. maskBitmap.draw(mask_mc,m)    
  21. //移除mask_mc.不需要了.    
  22. mask_mc.removeMovieClip()    
  23. //创建一个bitmap,用来存放复制过来的像素.用透明像素来添充    
  24. circleBitmap=new BitmapData(100,100,true,0x00FFFFFF)    
  25. //开始复制像素.    
  26. circleBitmap.copyPixels(myBitmap,myBitmap.rectangle,circleBitmap.rectangle.topLeft,maskBitmap,maskBitmap.rectangle.topLeft)    
  27. //显示bitmap    
  28. this.attachBitmap(circleBitmap,1)    
  29. //清除maskBitmap.    
  30. maskBitmap.dispose()   


ps by egoldy: flash8 BitmapData可以说是自flashmx2004升级为flash8后的最常用的类之一,但Bitmap的应用并不是纯Actionscirpt的应用。需要有一此相关的图像理论知识,比如颜色,alpha通道,threshold,像素,此文多少有一些偏向理论,所以发现过程文件无法在页面上展示,如果你遇到问题请在论坛里发问。
11.嵌入式控制器EC实战 KBC矩阵键盘Keyboard开发流程 文章目录笔记本矩阵键盘概述矩阵键盘的扫描方式行列扫描方式逐行逐列扫描方式EC中矩阵键盘是如何扫描并得到码值的(代码分析) 笔记本矩阵键盘概述 在EC中支持两种形式的键盘,一种是PS/2接口的键盘,这种键盘几乎已经被USB接口的键盘所取代,所以PS/2接口的键盘不在我们的讨论范围。 另一种键盘则是矩阵键盘,也是笔记本电脑的内置键盘,该键盘类似于学习单片机时使用的4*4的那种键盘,笔记本使用的矩阵键盘有三种规格,分别是16*8、17*8和18*8。16、17和18代表着该款键盘的列数,8代表着键盘的行数,我们这 阅读详情

相关推荐

[Stanford CS217]CUDA中矩阵乘法GEMM优化的最关键点:向量内积和向量外积分别取行和取列

对于矩阵C中的每一个tile,矩阵A与矩阵B中的tile只需要读取一次,这样就可以达到 O(N) 的计算强度。理想情况下性能应当受限于算术吞吐量,确切来说对于一个大型方阵,即 M=N=K ,矩阵乘法的数学操作复杂度为 O(N3) ,而数据量为 O(N2) ,同时计算强度为 N (这里的计算强度可以被理解为同一个数据被重复利用的次数)。GEMM就是指计算 C=A∗B+C ,其中 A 、B和C都是矩阵,A是 M×K 的矩阵,B是 K×N 的矩阵, C是 M×N 的矩阵。这就是向量内积和向量外积的最大区别。

weixin_55035144的博客 1425

Flash Player 10 处理位图(二)Bitmap 和 BitmapData 类

  像素贴紧和平滑 Bitmap 类的 pixelSnapping 属性可确定 Bitmap 对象是否贴紧最近的像素 。此属性接受 PixelSnapping 类中定义的三个常量之一:ALWAYS 、AUTO 和 NEVER 。 myBitmap.pixelSnapping = PixelSnapping.ALWAYS; 通常,缩放位图图像时,图像会变得模糊或...

秋天的童话 296

基于Jetson Nano与YOLOv5s的无人机道路抛洒物实时检测系统【附数据集+代码】

本文详细介绍基于Jetson Nano与YOLOv5s的无人机道路抛洒物实时检测系统,通过硬件选型、数据采集、模型优化等关键步骤,实现高效的道路安全监控。系统结合无人机高空视角和YOLOv5s算法,能精准识别各类抛洒物,实测准确率达98.2%,为交通管理提供智能化解决方案。

weixin_29081163的博客 1453

精通BitmapData

一、构造方法: var bmd:BitmapData=new BitmapData(200,100,true,0xffff0000); 参数说明: 1、宽 2、高 3、是否使用32位填充位图(包括alpha) 4、填充色。     二、属性(注意:所有属性都是只读) 1、widht 宽 2、height 高 3、rect 矩形范围,即:Rectangle 4、transp

Technology world 960

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1670

flash位图技术研究篇(8):扫描像素点

flash位图技术研究篇(8):扫描像素点

夏天的树人的专栏 4695

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

flash as3 无效的 BitmapData

有时候在浏览器中flash Player中会报如下错误:无效的 BitmapData。at flash.display::BitmapData/ctor()at flash.display::BitmapData()这是因为我们在创建位图数据:(new BitmapData(w,h))的时候 1.传进来的宽,高为0 2.传进来的宽,高为超...

weixin_30530939的博客 302

25、BDS-3卫星信号性能与PPP-B2b增强消息完整性分析

本文对BDS-3卫星信号性能及PPP-B2b增强消息的完整性进行了系统分析。评估了MEO、IGSO和GEO卫星的轨道与时钟精度,得出BDS-3总体SISRE为0.25 m,系统完整性可覆盖99.999%的误差。分析表明SIS中断主要由时钟调整和轨道机动引起,个别卫星存在因境外监测受限导致的非计划中断。通过自研解码软件对PPP-B2b增强消息进行采集与解析,实验结果显示BDS-3和GPS的平均历元完整性率均高于98.55%,其中卫星掩码和时钟校正消息的完整性率超过99.8%。研究还发现IGSO卫星相比MEO卫

quiet的专栏 143

链接文件及功能安全:Hightec如何将Flash驱动放进RAM

Fls本身是无法操作自身的,犯冲突。Fls_WriteCmdCycles (预留300字节)与 Fls_EraseCmdCycles(预留200字节) 函数在执行之前将会Copy进RAM,Fls本身是不能操作Fls本身的,除非把最底层的驱动函数防止在RAM或者其他的Flash里面,假设Flash放置在PF0可以操作PF1。英飞凌的驱动有个规定写指令预留300字节,擦除指令预留200字节。

梦想技术家 2140

flash游戏开发工作总结(3)--BitmapData比Movieclip优越

性能问题,一直都是游戏开发中永恒的话题。一个负责的程序员,总是会考虑代码的结构,扩展,以及优化。找到能让cpu使用下降一个点的技巧或优化都会鸡动不已。特别是flash开发,性能很容易非常差劲。 首先,这个标题不太恰当,bitmap和movieclip是两个东西。bitmap是静止的位图,movieclip是系列动画。

技术专研 304

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

flash 8 BitmapData 类的应用

  [1b]BitmapData类是什么[/1b] Flash.display.bitmapData允许我们使用像素层级来控制位图,这意味着什么呢,好,在下面的简介中我们将简介它能做什么。 ·复制和粘贴整个图像,部分图案。或者是每一个独立的像素。 ·鉴别或是改变像素或是像素群组的颜色。 ·应用新的FLASH滤镜。 ·创建随机的像素(noise或perlin noise)...

hgfghwq19 120

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flash8 BitmapData学习资料

在Actionscript 中使用Bitmaps http://www.webstudio.com.cn/tutorial/show.php?id=60 Flash8 BitmapData II http://www.webstudio.com.cn/tutorial/show.php?id=61 Flash8 BitmapData III http://www.webstudio.co...

weixin_30642869的博客 86

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

flash AIR 通过BitmapData生成图片到本地

手上有台android的平板,性能感觉还不错,创建了一个ActionScript手机项目玩玩,想通过截取屏幕,生成一张图片到平板的相册中。 目前在windows+flash builder,在模拟器下在widnows本地成功生成了jpg和png图片,在android平板上也成功了,虽然路径并不是android相册以至于现在还未找到图片在哪里... 大体流程就是: 通过Bit...

239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Bitmap类和BitmapData类

Bitmap类和BitmapData类    在影片中使用数字图像时会遇到两种不同类型的图形:位图和矢量图。Graphics类中提供了绘制矢量图的方法,对于位图,可以使用Loader类由外部导入,也可以使用ActionScript 3.0提供的位图相关类创建。Bitmap类和BitmapData类就是ActionScript 3.0中用于处理位图的两个重要的类。   位图图像有几个重要的指

ppy909的博客 1645

Bitmap与BitmapData整理

Flex中Bitmap和BitmapData类的资料整理 源地址:http://www.javaeye.com/topic/676016

xinshi9608的专栏 1459

绝对有用的BitmapData类

注:1.完成本教程需要你的脑子高速运转,小心撞车! 2.不是1024核的电脑请把帧率调到10的负100次方FPS! 3.本教程会越来越难,请把USB接口接到您的鼻子上以防忘记知识! BitmapData类可以直接处理位图,比如把一张位图转换成由无数细线构成的画,或者可以得知位图中一个点的RGB,甚至能做出面部识别器(我做过这个,利用人的头发识别脸的位置!)。 首先Bitma...

xiaoniba1024的专栏 2463

making things move as3阅读笔记 ---bitmapdata几个有用的操作函数

1. applyFilter(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, filter:BitmapFilter):void和generateFilterRect(sourceRect:Rectangle, filter:BitmapFilter):Rectangle applyFilter取得一个源图像

hili2006的专栏 981

关于bitmapData,滤镜等一些性能测试

注:> 指性能更好 1.地图滚动 之 纯copyPixes  和  BitmapData.scrollRect + copyPixes 结论: copyPixes > scroll + copyPixes   耗时差距1/15 - 1/20  相差不大 2.地图滚动 之  BitmapData alpha 对性能影响 结论:无alpha > 有alpha  差距  30% 以上

linxinboy的专栏 563

基于BitmapData的动画

前一段时间写了一个 回合制游戏的战斗画面 里面用到了 基于BitmapData的战斗动画 今天闲来无事 把以前的程序找出来 修改后 单独写了人物跑动的动画程序 网上的游戏素材少的可怜 自己截了一个 名将的序列图片 然后用 BitmapData的copyPixels方法进行截取后 实现了动画

1561

Flash 8 摄像头拍照

开始做法:第一步:在库中建立一个视频元件,类型选择:视频(受 ActionScript 控制)。第二步:将视频元件拖到场景中,并调整尺寸到想要的大小。并起名为“my_video”第三步:在时间轴中粘入下边的 code :var my_video:Video;my_video._x=100;my_video._y=40;var my_cam:Camera = Camera.get();my...

dengxiao9180的博客 387

JPGEncoder实现BitmapData图片数据保存

 这段时间工作忙,一直抽不出空来写点内容。今天晚上正好能静下心来,把工作中用到Flash位图数据保存整理一下,写了下面的应用实例。 package project.test { import flash.display.*; import flash.net.*; import flash.events.*; impo...

TTS 334

flash BitmapData.draw方法尝试

最近看了一些Bitmap以及滤镜相关的源文件,看不懂 脑子不够用! 看了一些简单的源文件,尝试使用BitmapData.draw方法,参照着做了实例以下是代码 效果演示  源文件下载 [img]/Files/BeyondPic/2006-9/26/rar.gif[/img] [url=http://www2.flash8.net/UploadTeach/2005/11/10/20...

hgfghe8 346

BitMapData知识 转

Bitmap和BitmapData 2010.5.25 smartblack整理 一、flash.display.Bitmap类及其两个子类 1、继承自DisplayObject,和InteractiveObject平级,所以无法调度鼠标事件,可以使用额外的包装容器(Sprite)来实现侦听。 2、只支持GIF、JPEG、PNG格式,不支持BMP(网上已有解决方法) 3、构造函...

weixin_30493401的博客 187
上一篇: AS3中的几个列表数据遍历
下一篇: 基于Flex-config.xml的命令行编译(转)
swingchen
博客等级 码龄20年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值