2011-08-05 2 views
1

포함되어 있습니다.가져 오기의 BitmapData 내가이 기능이 투명 영역, 효과 영역

대상 개체에서 비트 맵을 가져올 수 있지만 이미지의 모든 영역을 가져 오지 못하는 것처럼 보입니다.

대상 개체의 너비와 높이를 지정하면 디자인의 대상 개체가 Glow Effect로 적용되므로 내 질문에 displayObject에서 bitmapdata의 모든 뷰를 얻을 수 있습니까?

+1

'width'와'height' 대신에'DisplayObject.getBounds' 메서드를 사용하여 치수를 얻으려고 했습니까? 또한, 함수'cloneDpObj'의 이름을 오해의 소지가 있습니다.'DisplayObject'를 복제하지는 않습니다 만, 비트 맵 이미지를 복제하는 것이 가장 좋습니다. 단순히 새로운 Bitmap으로 렌더링한다고해도 말입니다. "클로닝"은 사람들이 코드를 읽는 맥락에서 꽤 잘 정의 된 의미를 가지고 있습니다. – amn

답변

4

BitmapData.draw()은 주어진 개체의 스냅 샷을 사용하여 스테이지에 적용된 모든 변환과 필터를 제거합니다. 결과 이미지는 동영상 라이브러리에있는 개체를 보여줍니다.

변환 및/또는 필터로 표시 객체를 그리는 데는 두 가지 기본 옵션이 있습니다.

  1. 그리기 중에 모든 변형을 매트릭스 매개 변수 BitmapData.draw()에 적용 할 수 있습니다. 드로잉 후에 BitmapData.applyFilter()으로 결과 비트 맵에 필터를 적용 할 수 있습니다.
  2. 개체 자체가 아니라 부모 컨테이너를 그립니다.

나는 보통 후자를 선택합니다. 그것은 매우 간단합니다. 몇 가지 단점이 있습니다. 두 번째 방법을 선택하면 대상에 부모 목록이 있어야하고 부모 컨테이너에있는 원치 않는 콘텐츠를 그릴 수 있습니다. (그러나 이러한 단점은 쉽게 제거됩니다.)

// bounds and size of parent in its own coordinate space 
var rect:Rectangle = target.parent.getBounds(target.parent); 
var bmp:BitmapData = new BitmapData(rect.width, rect.height, true, 0); 

// offset for drawing 
var matrix:Matrix = new Matrix(); 
matrix.translate(-rect.x, -rect.y); 

// Note: we are drawing parent object, not target itself: 
// this allows to save all transformations and filters of target 
bmp.draw(target.parent, matrix); 
0
실제로 녹스의 첫 번째 쉽게 접근 방식과 같은 옵션, 그리고 그것은 단지 하나 개의 코드 추가 라인을해야 할 함수 수정과 함께 갈 것

:

public static function cloneDpObj(target:DisplayObject):Bitmap 
{ 
    var duplicate:Bitmap; 

    var tBitData:BitmapData = new BitmapData(target.width, target.height); 
    tBitData.draw(target); 
    duplicate = new Bitmap(tBitData); 
    //add the filters 
    duplicate.filters = target.filters; 

    return duplicate; 
} 
+0

글쎄, 이것은 옵션이지만 이미지 영역에 대해서도해야합니다. 변환을 복사하려면 어쨌든 행렬 및 번역을 사용해야합니다. 부모 객체를 그리는 것보다 어렵다고 생각합니다. –

+0

귀중한 시간을내어 주신 모든 분들께 진심으로 감사드립니다. 그 기능을 향상 시켰지만 더 좋았지 만 캡처 결과의 너비가 1 픽셀 오프셋이므로 비트 맵 데이터 너비에 1 픽셀을 추가하기로 결정 했으므로 좋은 방법은 아닙니다. 내가 지금해야만하기 때문에, 나는 아직 그 문제를 모른다. 여기에 우리의 기능이 지금 있습니다 : –

1

적용된 필터로 찍은 영역을 포함하여 DisplayObject의 영역/사각형을 계산해야합니다. 다행히도 BitmapData 클래스의 generateFilterRect() 메서드를 사용하여 기본 제공 기능을 사용하여이 작업을 수행 할 수 있습니다.

또한 다른 이유로 인해 BitmapData 스냅 샷에 적용된 DisplayObject의 변형이 필요한 경우 소스 DisplayObject의 .transform을 전달할 수 있습니다. concatenatedMatrix을 BitmapData의 draw() 메서드의 두 번째 매개 변수로 사용합니다.

1

많은 시간을내어 귀중한 시간을내어 주셔서 감사합니다. 그 기능을 향상 시켰지만 더 좋았지 만 캡처 결과의 너비가 1 픽셀 오프셋이므로 비트 맵 데이터 너비에 1 픽셀을 추가하기로 결정 했으므로 좋은 방법은 아닙니다. 내가 지금해야만하기 때문에, 나는 아직 그 문제를 모른다. 여기에 우리 함수가 어떻게되어 있습니까?

public static function cloneDpObj(target:DisplayObject, optWidth:Number = -1, optHeight:Number = -1):Bitmap 
    { 
     var duplicate:Bitmap; 

     if (!target.parent) { 
      var tempSprite:Sprite = new Sprite; 
      tempSprite.addChild(target); 
     } 

     var rect:Rectangle = target.parent.getBounds(target.parent); 
     var bmp:BitmapData = new BitmapData(rect.width + 1, rect.height, true, 0); 

     // offset for drawing 
     var matrix:Matrix = new Matrix(); 
     matrix.translate(-rect.x, -rect.y); 

     // Note: we are drawing parent object, not target itself: 
     // this allows to save all transformations and filters of target 
     bmp.draw(target.parent, matrix); 

     duplicate = new Bitmap(bmp); 

     return duplicate; 
    }