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

Joh*_*ley 1 flash bitmap filter actionscript-3 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);
Run Code Online (Sandbox Code Playgroud)

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

有没有人对我怎么做这个有什么建议?

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

编辑

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

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

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

_bitmap.filters = [ColorMatrixFilter];
Run Code Online (Sandbox Code Playgroud)

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

_bitmap.filter = [];
Run Code Online (Sandbox Code Playgroud)

Sim*_*aud 5

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

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];
Run Code Online (Sandbox Code Playgroud)

如果您希望能够删除动态过滤器,则必须将它们应用于位图对象而不是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);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)