5

我在 Flash (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

我过去所做的是使用as3corelib,它包含 JPG ( JPGEncoder.as ) 和 PNG ( PNGEncoder.as ) 图像文件的编码器类。这些类使得从显示对象创建图像文件变得非常容易。

这是我的一个程序中的代码,它使用 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

bitmapData.copyPixels() 将允许您获取 bmpd 中像素的子矩形。

这是我确信 draw 中的 clipRectangle 可以一步完成的两个步骤,但是我昨天遇到了这个问题,并且无法让 clipRectangle 正常工作,所以我只是求助于这样做。

于 2011-08-20T20:16:39.560 回答
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 回答