从包含透明区域和效果区域的displayObject获取BitmapData

时间:2011-08-05 08:13:43

标签: actionscript-3 bitmapdata

我有这个功能:

    public static function cloneDpObj(target:DisplayObject):Bitmap
    {
        var duplicate:Bitmap;

        var tBitData:BitmapData = new BitmapData(target.width, target.height);
        tBitData.draw(target);
        duplicate = new Bitmap(tBitData);

        return duplicate;
    }

克隆目标displayObject(MovieClip或Sprite)并返回Bitmap Object。

它可以从目标对象获取位图,但它似乎没有得到图像的所有区域。

通过给出目标对象的宽度和高度,但是设计中的目标对象是由Glow Effect应用的,那么我的问题是我们可以从显示对象获得bitmapdata的所有视图吗?

4 个答案:

答案 0 :(得分:4)

BitmapData.draw()获取给定对象的快照,删除舞台上应用的所有变换和过滤器。生成的图像显示电影库中存在的对象。

使用转换和/或过滤器绘制显示对象时有两个基本选项。

  1. 您可以使用BitmapData.draw()的矩阵参数在绘图期间应用所有变换。绘制后,您可以使用BitmapData.applyFilter()将结果应用于生成的位图。
  2. 只绘制父容器,而不是对象本身。
  3. 我通常选择后者。这非常简单。有一些缺点:如果您选择第二种方法,您的目标必须具有父显示列表,您可以绘制驻留在父容器中的不需要的内容。 (但是,这些缺点很容易消除。)

    // bounds and size of parent in its own coordinate space
    var rect:Rectangle = target.parent.getBounds(target.parent);
    var bmp:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
    
    // offset for drawing
    var matrix:Matrix = new Matrix();
    matrix.translate(-rect.x, -rect.y);
    
    // Note: we are drawing parent object, not target itself: 
    // this allows to save all transformations and filters of target
    bmp.draw(target.parent, matrix);
    

答案 1 :(得分:1)

您需要计算DisplayObject的面积/矩形,包括应用的滤镜所占的面积。幸运的是,通过使用BitmapData类的generateFilterRect()方法,您可以使用内置功能。<​​/ p>

此外,由于其他原因,如果您需要将DisplayObject的变换应用于BitmapData快照,则可以将源DisplayObject的.transform。concatenatedMatrix作为BitmapData的draw()方法的第二个参数传递。

答案 2 :(得分:1)

非常感谢大家花时间回答我的问题。我改进了这个功能,但我更好,但我注意到捕获结果的宽度是1像素偏移,所以我决定在bitmapdata的宽度上加1个像素,我知道这不是一个好习惯。因为我现在必须这样做,我还不知道这个问题。以下是我们现在的功能:

 public static function cloneDpObj(target:DisplayObject, optWidth:Number = -1, optHeight:Number = -1):Bitmap
    {
        var duplicate:Bitmap;

        if (!target.parent) {
            var tempSprite:Sprite = new Sprite;
            tempSprite.addChild(target);
        }

        var rect:Rectangle = target.parent.getBounds(target.parent);
        var bmp:BitmapData = new BitmapData(rect.width + 1, rect.height, true, 0);

        // offset for drawing
        var matrix:Matrix = new Matrix();
        matrix.translate( -rect.x, -rect.y);

        // Note: we are drawing parent object, not target itself: 
        // this allows to save all transformations and filters of target
        bmp.draw(target.parent, matrix);

        duplicate = new Bitmap(bmp);

        return duplicate;
    } 

答案 3 :(得分:0)

我实际上将Nox的第一个选项作为更简单的方法,并且修改你的功能只需要额外的一行代码:

public static function cloneDpObj(target:DisplayObject):Bitmap
{
    var duplicate:Bitmap;

    var tBitData:BitmapData = new BitmapData(target.width, target.height);
    tBitData.draw(target);
    duplicate = new Bitmap(tBitData);
    //add the filters
    duplicate.filters = target.filters;

    return duplicate;
}