2012-10-23 82 views
0

我想將包含透明區域的圖片作爲掩碼應用於顯示對象。 面具只顯示面具有顏色的區域,但實際上顯示對象仍然顯示整個區域,所以我將位圖轉換爲矢量圖像,這是解決問題的方法,但是轉換方法太可怕了。如何設置位圖作爲掩碼

public static function createVectorImage(bd:BitmapData,colorKey:uint = 0):Shape{ 

     if(bd==null){ 
      return null; 
     } 
     var sh:Shape = new Shape(); 
     var g:Graphics = sh.graphics; 
     g.beginBitmapFill(bd); 
     var beginPixel:int = -1; 
     var i:int,il:int,j:int,jl:int; 
     var value:uint; 
     for(i = 0,il=bd.height;i<il;i++){ 
      for(j = 0,jl = bd.width;j<jl;j++){ 
       value = bd.getPixel32(j,i); 
       if(value!=colorKey&&beginPixel==-1){ 
        beginPixel = j; 
       }else if(value==colorKey&&beginPixel!=-1){ 
        //draw rect 
        g.drawRect(beginPixel,i,j-beginPixel,1); 
        beginPixel = -1; 
       } 
      } 
      if(beginPixel!=-1){ 
       g.drawRect(beginPixel,i,j-beginPixel,1); 
       beginPixel = -1 
      } 
     } 
     g.endFill(); 

     return sh; 
    } 

有沒有比這更好的方法?

回答

1

另一種選擇是使用bitmap caching。它需要被應用到面罩還有maskee:

var bd:BitmapData = new BitmapData(200, 200, true, 0x00000000); 
bd.fillRect(new Rectangle(0, 0, 40, 40), 0xff000000); 

var mask:Bitmap = new Bitmap(bd); 
mask.cacheAsBitmap = true; 

var maskee:Sprite = new Sprite(); 
maskee.cacheAsBitmap = true; 
maskee.graphics.beginFill(0xff0000, 1); 
maskee.graphics.drawRect(0, 0, 200, 200); 
maskee.graphics.endFill(); 
maskee.mask = mask; 

addChild(mask); 
addChild(maskee); 
+0

我已經嘗試過這種方式,但我失敗了,因爲我沒加罩的顯示列表addChild(mask),使事情不同 – Max

3

您可以將顯示對象轉換爲位圖,然後在其上應用掩膜。

  1. 轉換你顯示對象的位圖數據:

    var rect:Rectangle = displayObject.getRect(); 
    var displayBD:BitmapData = new BitmapData(rect.width, rect.height, true, 0); 
    
    displayBD.draw(displayObject); 
    
  2. 應用掩模:

    private static const ORIG:Point = new Point(0, 0); 
    private static function createBitmapDataWithMask(
         baseBD:BitmapData, maskBD:BitmapData):BitmapData 
    { 
        var bitmapData:BitmapData; 
    
        bitmapData = new BitmapData(baseBD.width, baseBD.height, true, 0x000000); 
        bitmapData.copyPixels(baseBD, baseBD.rect, ORIG, maskBD, ORIG, true); 
    
        return bitmapData; 
    } 
    
  3. 顯示的位圖數據:

    var bitmapData:BitmapData = createBitmapDataWithMask(displayBD, maskBD); 
    var bitmap:Bitmap = new Bitmap(bitmapData, "auto", true); 
    
    addChild(bitmap); 
    
  4. 如果您從舞臺上刪除位圖,請不要忘記釋放位圖數據!

    removeChild(bitmap); 
    bitmap.bitmapData.dispose(); 
    bitmap = null; 
    
+0

它做某些情況下工作,但不是很普遍 – Max