Bitmap與Bitmapdata


一個 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ÿ­„


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM