【问题标题】:Actionscript: How to remove a filter from BitmapDataActionscript:如何从 BitmapData 中删除过滤器
【发布时间】:2011-09-03 06:35:03
【问题描述】:

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

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,因此未绘制。

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

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

_bitmap.filters = [ColorMatrixFilter];

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

_bitmap.filter = [];

【问题讨论】:

    标签: flash actionscript-3 filter bitmap bitmapdata


    【解决方案1】:

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

    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];
    

    如果您希望能够动态删除过滤器,则必须将它们应用于位图对象而不是位图数据对象。 然后你可以_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 绘制图像的方式是将像素从 bitmapData 复制到屏幕上的一个矩形上,因此不使用位图本身。这就是为什么当我将过滤器应用于位图数据而不是实际位图时过滤器起作用的原因。
    • 因此,如果不实际编辑引擎,我不相信我想做的事情是可能的。不过感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多