我在闪光灯(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));
但是当我在画布上的视频上绘制的图形超出舞台显示区域的界限时,这会给我带来不必要的结果。如何仅在舞台内可见区域的范围内限制图像快照?
由于
答案 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正常运行,所以我只是采取了这样做。