一個 Bitmap 對象可在若干 Bitmap 對象之中共享其 BitmapData 引用,與轉換屬性或旋轉屬性無關。
由於能夠創建引用相同 BitmapData 對象的多個 Bitmap 對象,因此,多個顯示對象可以使用相同的復雜 BitmapData 對象,
而不會因為每個顯示對象實例使用一個 BitmapData 對象而產生內存開銷。
示例1:創建500個位圖,每個位圖使用不同引用的BitmapData的內存
import flash.display.BitmapData; import flash.display.Bitmap; import flash.system.System; //打印初始的內存情況 trace("開始空閑時內存: "+System.totalMemory/1000+"k"); var bmpdt:BitmapData; for(var i:int=0;i<500;i++) { //每次都是新的bitmapData給bitmap bmpdt=new BitmapData(100,100,false,0xffccdd); var bmp:Bitmap=new Bitmap(bmpdt); addChild(bmp) bmp.x=i+3; bmp.y=i+3; } trace("創建完畢后內存: "+System.totalMemory/1000+"k");
結果:
開始空閑時內存: 34328.576k
創建完畢后內存: 55169.024k
示例2:創建500個位圖,每個位圖使用了同一個BitmapData的引用
import flash.display.BitmapData; import flash.display.Bitmap; import flash.system.System; //打印初始的內存情況 trace("開始空閑時內存: "+System.totalMemory/1000+"k"); var bmpdt:BitmapData=new BitmapData(100,100,false,0xffccdd);; for(var i:int=0;i<500;i++) { var bmp:Bitmap=new Bitmap(bmpdt); addChild(bmp) bmp.x=i+3; bmp.y=i+3; } trace("創建完畢后內存: "+System.totalMemory/1000+"k");
結果:
開始空閑時內存: 34373.632k
創建完畢后內存: 34799.616k
像素貼緊和平滑
bmp.smoothing=true;位圖縮放時 會模糊 。使用 Bitmap.smoothing=true;會讓圖像更平滑自然,也會更加消耗性能
應用濾鏡
在將 smoothing 設置為 true 的情況下繪制位圖要比在將 smoothing 設置為 false 的情況下執行相同操作更為緩慢。
import flash.display.BitmapData; import flash.geom.Rectangle; import flash.geom.Point; import flash.filters.BlurFilter; import flash.display.Bitmap; //創建bitmapData var bmpdt:BitmapData=new BitmapData(80,30,false,0xffccdd); //創建一個Rectangle 這個rect會指定到bitmapdata的坐標上 var rect:Rectangle=new Rectangle(20,10,40,10); //對這個區域 填充顏色 bmpdt.fillRect(rect,0x0033ff); //獲取這個矩形的左上角坐標 var pt:Point=new Point(rect.left,rect.top); var blFilter:BlurFilter=new BlurFilter(8,8,1); bmpdt.applyFilter(bmpdt,rect,pt,blFilter); var bmp:Bitmap=new Bitmap(bmpdt); addChild(bmp);
濾鏡
濾鏡和位圖緩存:若要對顯示對象應用濾鏡,必須啟用該對象的位圖緩存。在對 cacheAsBitmap 屬性設置為false 的顯示對象應用濾鏡時,Flash Player 會自動將該對象的 cacheAsBitmap 屬性的值設置為 true。如果您以后刪除了該顯示對象中的所有濾鏡,Flash Player 會將 cacheAsBitmap 屬性重置為最后設置的值。
在運行時更改濾鏡:如果已經對顯示對象應用了一個或多個濾鏡,則無法向 filters 屬性數組添加其它濾鏡。若要添加或更改應用的這組濾鏡,需要創建整個濾鏡數組的副本,然后對此(臨時)數組進行修改。然后,將此數組重新分配給顯示對象的 filters 屬性,這樣才能將濾鏡應用於該對象。
濾鏡示例:
var bmpdt:BitmapData=new BitmapData(100,100,true,0xffccddee); var bmp:Bitmap=new Bitmap(bmpdt); addChild(bmp); var filter:BlurFilter=new BlurFilter(10,10,1); //聲明一個rectangel 坐標是絕對坐標和區域 var rect:Rectangle=new Rectangle(50,50,50,50); var p:Point=new Point(50,50); //必須有填充色 否則濾鏡無效 bmpdt.fillRect(rect,0xffFF0000); bmpdt.applyFilter(bmpdt,rect,p,filter); colorTransform示例: var bmd1:BitmapData = new BitmapData(100,100,true,0xffffccdd); var bmp:Bitmap=new Bitmap(bmd1); addChild(bmp); var clorTran:ColorTransform=new ColorTransform(); //顏色轉換 透明度設置0.7 clorTran.alphaMultiplier=0.7; var rect:Rectangle=new Rectangle(50,50,20,20); //對 Bitmapdata設置colorTranform bmd1.colorTransform(rect,clorTran);
復制像素
import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Rectangle; import flash.geom.Point; //目標Bitmapdata 待被復制 var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF); var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44); //原始Bitmapdata打個標記 bmd1.setPixel(15,15,0x00ff0000); var rect:Rectangle = new Rectangle(10, 10, 10, 10); var pt:Point = new Point(30, 10); //從Bitmapdata源的rect區域復制到 pt里 bmd2.copyPixels(bmd1, rect, pt); var bm1:Bitmap = new Bitmap(bmd1); this.addChild(bm1); var bm2:Bitmap = new Bitmap(bmd2); this.addChild(bm2); bm2.x = 50;
draw()
BitmapData.draw(source:IBitmapDrawable):void
DisplayObject 和 BitmapData 類實現了 IBitmapDrawable接口
floodFill類似Flash工具里的油漆桶
var bmpdt:BitmapData=new BitmapData(200,200,false,0xff0000); var rect:Rectangle=new Rectangle(0,0,100,100); bmpdt.fillRect(rect,0x00ff00); rect.x=50; rect.y=50; bmpdt.fillRect(rect,0x0000ff); rect.x=100; rect.y=100; bmpdt.fillRect(rect,0xff00ff); //floodFill相當於油漆桶傾倒功能 bmpdt.floodFill(90,90,0xffccee) var bmp:Bitmap=new Bitmap(bmpdt); addChild(bmp);
getPixels(rectangle)
從像素數據的矩形區域生成一個字節數組。為每個像素將一個無符號整數(32 位未經相乘的像素值)寫入字節數組。
import flash.display.BitmapData; import flash.geom.Rectangle; import flash.display.Bitmap; import flash.utils.ByteArray; var bmd:BitmapData = new BitmapData(a.width, a.height, true); bmd.draw(a); var bounds:Rectangle = new Rectangle(0, 0, bmd.width, bmd.height); //BitmapData.getPixels(rectangel):ByteArray 獲取圖像數據的一個Rectangle的二進制數據 var pixels:ByteArray = bmd.getPixels(bounds); trace(pixels)
//ÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔ
ÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔ
ÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔ
ÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔÿÔÔÔ
ÿÔÔÔÿÔÔÔÿ3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ
3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ3ÿ
3ÿ3ÿ