Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash Actionscript:如何从BitmapData中删除筛选器_Flash_Actionscript 3_Filter_Bitmap_Bitmapdata - Fatal编程技术网

Flash Actionscript:如何从BitmapData中删除筛选器

Flash Actionscript:如何从BitmapData中删除筛选器,flash,actionscript-3,filter,bitmap,bitmapdata,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.appl

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

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类中的位图数据。我所有的代码都是使用FlashDevelop编写和编译的

编辑

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

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

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

_bitmap.filters = [ColorMatrixFilter];
_bitmap.filter = [];
然后,我可以通过执行以下操作删除过滤器:

_bitmap.filters = [ColorMatrixFilter];
_bitmap.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];
如果您希望能够动态删除过滤器,则必须将其应用于位图对象,而不是BitmapData对象。 然后您可以执行
\u 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);
        }

    }
}

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

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对象。 然后您可以执行
\u 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);
        }

    }
}

如果我在图像上加上反向滤镜,它只会把它全部变成白色。当我尝试添加到_bitmap.filters时,似乎什么都没有发生。这样做的正确语法是什么?对于第一种方法是的,我不知道正确的矩阵,我在回答中添加了一个示例来说明如何删除过滤器。嗯,我假设是这样做的。然而,这对我不起作用。我认为这是因为flashpunk引擎创建图像的方式。如果我在应用过滤器后直接将位图作为子对象添加,则会在屏幕左上角使用过滤器绘制新图像,但我的原始图像在没有过滤器的情况下仍保留在正确的位置。我认为flashpunk绘制图像的方式是将位图数据中的像素复制到屏幕上的矩形上,因此不使用位图本身。这就是为什么当我将过滤器应用于位图数据而不是实际位图时,它起作用的原因。因此,我认为如果不实际编辑引擎,我想做的事情是不可能的。不过谢谢你的帮助。如果我在图像上添加反向过滤器,它只会使图像变为白色。当我尝试添加到_bitmap.filters时,似乎什么都没有发生。这样做的正确语法是什么?对于第一种方法是的,我不知道正确的矩阵,我在回答中添加了一个示例来说明如何删除过滤器。嗯,我假设是这样做的。然而,这对我不起作用。我认为这是因为flashpunk引擎创建图像的方式。如果我在应用过滤器后直接将位图作为子对象添加,则会在屏幕左上角使用过滤器绘制新图像,但我的原始图像在没有过滤器的情况下仍保留在正确的位置。我认为flashpunk绘制图像的方式是将位图数据中的像素复制到屏幕上的矩形上,因此不使用位图本身。这就是为什么当我将过滤器应用于位图数据而不是实际位图时,它起作用的原因。因此,我认为如果不实际编辑引擎,我想做的事情是不可能的。谢谢你的帮助。