Actionscript:如何从BitmapData中删除过滤器

时间:2011-05-27 09:41:34

标签: flash actionscript-3 filter bitmap bitmapdata

我使用以下代码在图像上添加了黑白滤镜:

var n:Number = 1/3;
var matrix:Array = [n,n,n,0,0,
                    n,n,n,0,0,
                    n,n,n,0,0, 
                    0,0,0,1,0];
var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix);

_bitmap.bitmapData.applyFilter(_buffer, _sourceRect, new Point(), cmf);

我现在希望能够删除此过滤器,但我似乎无法弄清楚如何。我已经读过,如果我清除_bitmap.filters数组,它应该被删除,但是当我检查时,这个数组是空的。

有没有人对我如何做到这一点有任何建议?

修改 我正在使用FlashPunk游戏引擎,我正在操作Image.as类中的bitmapData。我的所有代码都是使用FlashDevelop编写和编译的。

修改

由于flashpunk flashpunk引擎中的图像类使用bitmapData.CopyPixels()函数绘制位图,因此我无法将过滤器直接应用于位图。过滤器未应用于bitmapData,因此未被绘制。

我已经将render方法更改为使用bitmapData.draw()函数,该函数使用实际的位图来绘制图像。

我现在可以通过执行以下操作向我的位图添加过滤器:

_bitmap.filters = [ColorMatrixFilter];

然后我可以通过执行以下操作删除我的过滤器:

_bitmap.filter = [];

1 个答案:

答案 0 :(得分:5)

当您直接将滤镜应用于位图数据时,您无法将其删除,因为滤镜最终会修改像素颜色,但是,您可以尝试通过执行反向操作来恢复它:

var matrix:Array = [1/n,1/n,1/n,0,0,
                    1/n,1/n,1/n,0,0,
                    1/n,1/n,1/n,0,0, 
                    0,0,0,1,0];

如果您希望能够删除动态过滤器,则必须将它们应用于位图对象而不是BitmapData对象。 然后,您可以_bitmap.filters = [];删除所有过滤器

此处显示了如何在4秒后删除过滤器的示例:

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.filters.ColorMatrixFilter;
    import flash.utils.setTimeout;

    public class TestTextfield extends Sprite
    {
        public function TestTextfield()
        {
            var bd1 : BitmapData = new BitmapData(300,300);
            var randomNum:Number = Math.floor(Math.random() * 10);
            bd1.perlinNoise(100, 80, 6, randomNum, false, true, 1, true, null);

            var n:Number = 1/3;
            var matrix:Array = [n,n,n,0,0,
                                n,1,n,0,0,
                                n,1,n,0,0, 
                                0,0,0,1,0];
            var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix);

            var bitmap : Bitmap = new Bitmap(bd1);

            bitmap.filters = [cmf];

            addChild(bitmap);

            setTimeout(function():void{
                bitmap.filters = [];
            }, 4000);
        }

    }
}