As3.0 BitmapData draw和copyPixel 基本用法

參考文章:https://www.cnblogs.com/yili16438/archive/2012/04/04/2431644.htmlhtml

 

copyPixel:像素拷貝,從源位圖上選取一個矩形區域,拷貝到目標位圖的指定點位置。函數

參數詳解:spa

sourceBitmapData:BitmapData — 要從中複製像素的輸入位圖圖像。源圖像能夠是另外一個 BitmapData 實例,也能夠指當前 BitmapData 實例。code

sourceRect:Rectangle — 定義要用做輸入的源圖像區域的矩形。 orm

destPoint:Point — 目標點,它表示將在其中放置新像素的矩形區域的左上角。 htm

alphaBitmapData:BitmapData (default = null) — 第二個 Alpha BitmapData 對象源。  對象

alphaPoint:Point (default = null) — Alpha BitmapData 對象源中與 sourceRect 參數的左上角對應的點。  blog

mergeAlpha:Boolean (default = false) — 若要使用 Alpha 通道,請將該值設置爲 true。若要複製不含 Alpha 通道的像素,請將該值設置爲 false。  接口

 簡單用法:遊戲

 var originalRectH:Number = event.bitmapData.height;

var originalRectW:Number = event.bitmapData.width;

var bitmapData:BitmapData = new BitmapData(originalRectH,originalRectW);
bitmapData.
copyPixels(event.bitmapData, new Rectangle(0,originalRectH/2,originalRectW,originalRectH/2), new Point(originalRectH/2, 0));
main.renderer.bitmapData = bitmapData;
var bitmap:Bitmap = new Bitmap(bitmapData);
bitmap.width = 600;
bitmap.height = 300;
bitmap.y = 200;

addChild(bitmap);

 

 

* 這裏想重點說一下第4,5,6參數。第4,5參數通常是一塊兒用,用來指定一個Alpha圖像源中的矩形區域,這個區域左上角由alphaPoint指定,寬高則和sourceRect同樣。當該區域中alpha通道爲0時,則渲染後是透明的,爲1時則爲可見,由些,能夠實現半透明乃致全透明的效果,在2D頁遊中能夠作出比較真實的遮擋效果,看下圖(左邊爲使用了alphaBitmapData):

 

關於第6個參數,是否使用alpha混合,看個圖就明白了:

 

 

draw:繪製一個對象,該對象須要實現IBitmapDrawable接口,像DisplayObject。

參數詳解:

source:IBitmapDrawable — 要繪製到 BitmapData 對象的顯示對象或 BitmapData 對象。(DisplayObject 和 BitmapData 類實現 IBitmapDrawable 接口。)  

matrix:Matrix (default = null) — 一個 Matrix 對象,用於縮放、旋轉位圖或轉換位圖的座標。若是不想將矩陣轉換應用於圖像,請將此參數設置爲恆等矩陣(使用默認 new Matrix() 構造函數建立),或傳遞 null 值。 

colorTransform:ColorTransform (default = null) — 一個 ColorTransform 對象,用於調整位圖的顏色值。若是沒有提供任何對象,則不會轉換位圖圖像的顏色。若是必須傳遞此參數但又不想轉換圖像,請將此參數設置爲使用默認 new ColorTransform() 構造函數建立的 ColorTransform 對象。 

blendMode:String (default = null) — 來自 flash.display.BlendMode 類的一個字符串值,指定要應用於所生成位圖的混合模式。  

clipRect:Rectangle (default = null) — 一個 Rectangle 對象,定義要繪製的源對象的區域。若是不提供此值,則不會進行剪裁,而且將繪製整個源對象。  

smoothing:Boolean (default = false) — 一個布爾值,用於肯定因在 matrix 參數中指定縮放或旋轉而對 BitmapData 對象進行縮放或旋轉之後,是否對該對象進行平滑處理。smoothing 參數只有在 source 參數是 BitmapData 對象時才適用。在將 smoothing 設置爲 false 的狀況下,通過旋轉或縮放的 BitmapData 圖像可能會顯得像素化或帶有鋸齒。 

 簡單用法:

var originalRectH:Number = event.bitmapData.height;
var originalRectW:Number = event.bitmapData.width;
var bitmapData:BitmapData = new BitmapData(originalRectH,originalRectW);
bitmapData.draw(event.bitmapData,null,null,null,new Rectangle(0,0,originalRectW,originalRectH/2));
main.renderer.bitmapData = bitmapData;
var bitmap:Bitmap = new Bitmap(bitmapData);
bitmap.width = 600;
bitmap.height = 300;
bitmap.y = 200;
container.addChild(bitmap);

 

 

* 裏面有兩個參數matrix和clipRect和copyPixel中的destPoint、sourceRect很像,但用法倒是天差地別。

copyPixel能夠指定繪製的區域以及繪製到目標位圖的位置,draw也能夠,但卻須要注意參數的用法和copyPixel是不一樣的。

matrix是矩陣轉換,能夠進行位移,旋轉,縮放操做,可是可是,注意,這個操做都是對源位圖進行操做,並不是是目標位圖上的操做,而clipRect也是指源位圖上的區域。

因此matrix和clipRect這兩上參數的含義是:源位圖通過矩形轉換後,再從源位圖上拷貝clipRect指定的區域,到目標位圖上的clipRect區域,看清楚了,是目標位圖上的clipRect區域!

通過這樣理解後,咱們能夠把draw方法包裝一下:

 

public  static  function  draw(target:BitmapData, source:IBitmapDrawable, rect:Rectangle, pt:Point, colorTransform:ColorTransform = null , scale: Number  = 1 ): void
{
     clipRect.x = pt.x;
     clipRect.y = pt.y;
     clipRect.width = rect.width * scale;
     clipRect.height = rect.height * scale;
     matrix.tx = pt.x - rect.x;
     matrix.ty = pt.y - rect.y;
     matrix.a = matrix.d = scale; //x,y分別縮放
     target.draw(source, matrix, colorTransform, null , clipRect, false );
}

  

包裝後的用法就和copyPixel同樣了。

並且更重要的是,draw能夠縮放,能夠顏色轉換,能夠濾鏡。

同時使用後:

 

 

*關於colorTransform參數,遊戲中一我的物受擊的時候,咱們會給把人物的形象變紅,colorTransform.redOffset=100,這樣人物的紅色通道就會更深,當人物中毒的時候,能夠加深綠色通道,當人物燒焦的時候,變黑等等。

 

最後,copyPixel的效率比draw高,因此通常狀況下,copyPiexl用得比較多,draw會用在比較特殊的地方,並且不會每幀都調用,選擇性的調用。

 

-----------------------整理備忘 end--------------------------------------

相關文章
相關標籤/搜索