2012-10-23 46 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