拍摄闪光灯中显示对象可见区域的快照

时间:2011-07-28 10:47:58

标签: flash actionscript-3 displayobject

我在闪光灯(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));

但是当我在画布上的视频上绘制的图形超出舞台显示区域的界限时,这会给我带来不必要的结果。如何仅在舞台内可见区域的范围内限制图像快照?

由于

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

根据画布大小设置clipRect参数(设置宽度和高度等于画布宽度和高度)。

答案 2 :(得分:0)

bitmapData.copyPixels()允许你在bmpd中获得像素的子矩形。

执行我确定绘制中的clipRectangle会在一步中完成的两个步骤,但我昨天确实遇到了这个问题,并且无法使clipRectangle正常运行,所以我只是采取了这样做。