5

カメラ入力アプリをフラッシュ(AS3)で使用していて、その上にグラフィックを描画しています。ステージの可視領域の画像スナップショットを撮りたいのですが、ビデオの上に描いたグラフィックだけをビデオに撮ります。画像スナップショットからコントロールを除外したい。私の表示オブジェクトのレイアウトは次の関係にあります。

-stage
 --canvas (Sprite)
  ---video (Video)
  ---overlayed graphics (Sprites, MCs, Shapes)
 --controls (Buttons)

ステージサイズは固定されており、キャンバス要素の子であるすべての画像スナップショットを撮りたいです(カメラ入力ビデオとオーバーレイグラフィックス、ただしコントロールは除く)。オーバーレイされたグラフィックがステージサイズの範囲内にある場合、この画像スナップショットを作成できます。私はこのようにします:

var bmpd:BitmapData = new BitmapData(canvas.width, canvas.height);
bmpd.draw(canvas, new Matrix(1, 0, 0, 1, canvas.x, canvas.y));

しかし、これは、キャンバス上のビデオの上に描画するグラフィックがステージの表示領域の境界を超えると、望ましくない結果をもたらします。ステージ内の表示領域の境界でのみ画像スナップショットを制限するにはどうすればよいですか?

ありがとう

4

3 に答える 3

2

私が過去に行ったことは、 JPG( JPGEncoder.as)とPNG(PNGEncoder.as)の両方の画像ファイルのエンコーダークラスを含むas3corelibを使用することです。これらのクラスを使用すると、表示オブジェクトから画像ファイルを簡単に作成できます。

これは、私のプログラムの1つからのコードで、FileReferenceを使用して、ステージ全体とそのすべての子の.pngをローカルディスクに保存します。

//Save Canvas Snapshot
private function saveCanvasSnapshot():void
    {
    var bitmapData:BitmapData = new BitmapData(DropSwatch.controller.stage.stageWidth, DropSwatch.controller.stage.stageHeight);
    bitmapData.draw(DropSwatch.controller);
    var file:ByteArray = PNGEncoder.encode(bitmapData);

    var fileReference:FileReference = new FileReference();
    fileReference.save(file, "DropSwatchCanvas.png");
    }

あなたの場合、コントロールを除くすべてのレイヤーが必要なので、biamapDataを描画している間、コントロールレイヤーを非表示にして、後で再表示することができます。次に、PNGEncoder(またはJPGEncoder)を使用してbitmapDataをエンコードし、それをByteArrayに割り当て、byteArrayを.png(または.jpg)として保存します。

于 2011-07-28T12:16:37.360 に答える
0

draw(source:IBitmapDrawable、matrix:Matrix = null、colorTransform:flash.geom:ColorTransform = null、blendMode:String = null、clipRect:Rectangle = null、smoothing:Boolean = false):void

キャンバスサイズに応じてclipRectパラメーターを設定します(幅と高さをキャンバスの幅と高さに等しく設定します)。

于 2011-07-28T10:54:58.257 に答える
0

ビットマップデータ.copyPixels()を使用すると、bmpdのピクセルのサブ長方形を取得できます。

これは、描画中のclipRectangleが1つのステップで実行すると確信していることを実行するための、2つのステップですが、昨日はまさにこの問題が発生し、clipRectangleを正しく機能させることができなかったため、代わりにこれを実行しました。

于 2011-08-20T20:16:39.560 に答える