2012-10-23 2 views
0

투명한 영역을 마스크로 사용하여 그림을 표시 객체에 적용하려고합니다. 마스크는 color.but 영역 만 보여줍니다. 사실, 표시 객체는 전체 영역을 보여줍니다. 따라서 비트 맵을 벡터 이미지로 변환하면 문제가 해결되지만 변환 방법은 끔찍합니다.비트 맵을 마스크로 설정하는 방법

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 (마스크), 사물을 다르게합니다. – Max

3

표시 객체를 비트 맵으로 변환 한 다음 마스크를 적용 할 수 있습니다.

var rect:Rectangle = displayObject.getRect(); 
var displayBD:BitmapData = new BitmapData(rect.width, rect.height, true, 0); 

displayBD.draw(displayObject); 
  • 마스크 적용 :

    1. 는 비트 맵 데이터 객체를 표시 변환

      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; 
      } 
      
    2. 디스플레이를 비트 맵 데이터 :

      var bitmapData:BitmapData = createBitmapDataWithMask(displayBD, maskBD); 
      var bitmap:Bitmap = new Bitmap(bitmapData, "auto", true); 
      
      addChild(bitmap); 
      
    3. 스테이지에서 비트 맵을 제거하면 비트 맵 데이터를 삭제하는 것을 잊지 마십시오!

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

    는 어떤 경우에 일을하지만, – Max