Actionscript: как удалить фильтр из BitmapData - PullRequest
1 голос
/ 27 мая 2011

Я добавил черно-белый фильтр на изображение, используя следующий код:

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 и манипулирую данными bitmapData из класса Image.as. Весь мой код написан и скомпилирован с использованием FlashDevelop.

EDIT

Мне не удалось применить фильтр непосредственно к растровому изображению из-за того, что класс изображения в движке flashpunk flashpunk рисовал растровое изображение с помощью функции bitmapData.CopyPixels (). Фильтр не был применен к bitmapData и поэтому не отображался.

Я изменил метод рендеринга для использования функции bitmapData.draw (), которая использует фактическое растровое изображение для рисования изображения.

Теперь я могу добавить фильтр к своему растровому изображению, выполнив следующее:

_bitmap.filters = [ColorMatrixFilter];

Затем я могу удалить свои фильтры, выполнив следующие действия:

_bitmap.filter = [];

1 Ответ

5 голосов
/ 27 мая 2011

Когда вы применяете фильтр непосредственно к растровым данным, вы не можете удалить его, потому что фильтр определенно изменяет цвет пикселя, однако вы можете попытаться восстановить его, выполнив обратную операцию:

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, а не к объекту 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);
        }

    }
}
...