MCのスナップショットをとる
MC(というかDisplayObject)のスナップショットをBitmapDataとして取る方法を自分なりにメモします
var spt :Sprite = new Niku() as Sprite; // リンケージで生成した表示クラス var bmp:BitmapData = new BitmapData( spt.width, spt.height ); bmp.draw( spt ); addChild( new Bitmap( bmp ) );
基本的にはこれでスクリーンショットとして取得したBitmapDataを表示することができます
ですが、もし原点が中身の表示オブジェクトに対して左上に来ない場合があります。
そうするとただBitamapData.drawしても切れてしまいます。
それを解消したのが次のコード。
DisplayObject.getRectで対象の表示オブジェクトにとっての内部の矩形エリアをRectangleで取得できます。
取得したRectangleの(x, y)を反転させたMatrixを使ってdrawする位置をずらすことで切れないようにすることができます。
var spt :Sprite = new Niku() as Sprite; // リンケージで生成した表示クラス var bmp:BitmapData = new BitmapData( spt.width, spt.height ); // 中身の原点からの位置を取得する var rect:Rectangle = spt.getRect( spt ); var mtx:Matrix = new Matrix(); mtx.tx =- rect.x; mtx.ty = -rect.y; bmp.draw( spt, mtx ); addChild( new Bitmap( bmp ) );
ただし、DisplayObject.getRectかDisplayObject.getBoundsで同じように矩形が取れますが getRectはシェイプの外側の線を含めません。
これにより、たとえば線が含まれている場合、getRectだと矩形の外側の線がすこし削れてしまいます。 逆にgetBoundsだと、もとの表示オブジェクトより線の分矩形が大きくなるのと、配置するときに同じ座標だとずれて見えます。
利用する場面や対象の素材によってどちらで実装するか注意が必要です。
getRectのほうのサンプルを公開します。(少し書き直せばAS2でもいけると思います。)
- サンプルとソース(AS3版:要FlashCS3)