【问题标题】:take snapshot of display object visible area in flash在 Flash 中拍摄显示对象可见区域的快照
【发布时间】:2011-07-28 10:47:58
【问题描述】:

我在 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));

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

谢谢

【问题讨论】:

    标签: flash actionscript-3 displayobject


    【解决方案1】:

    我过去所做的是使用 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 as3corelib 提及。看起来低调的神奇图书馆
    【解决方案2】:

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

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

    【讨论】:

    • clipRect 是否与 Matrix 一样用于设置绘制位置的坐标原点,还是仅使用矩形的宽度/高度从 0,0 开始绘制?不记得我的头顶,我的印象是为了在某个点上绘制一个特定的点,你需要一个平移矩阵作为绘制参数。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多