Побитовые операции на растровых изображениях в Flex / AS3 - PullRequest
1 голос
/ 21 сентября 2009

Существует специальная побитовая логическая операция для трех битовых карт, которую я хотел бы достичь во Flex / AS3. Предположительно, это должно быть сделано с помощью некоторой комбинации режимов наложения DisplayObject, фильтров ColorMatrix и, возможно, чего-то еще, о чем я не думал, поскольку FLex / As3 не имеет побитовых логических операций над пикселями (за исключением BlendMode.INVERT). 1001 *

Итак, вот операция:

(B & S) | (F & ~ S)

[где B, S, F - три растровых изображения]

Вот и все.

Между прочим, я пробовал это с Pixel Bender, но невероятно, что он также не имеет побитовых логических операций. (Что именно ты думаешь, Adobe). Поэтому я смоделировал их без примерно 50 модулей и делений, но получилось слишком медленно. (Может быть потому, что у меня не было поддерживаемой графической карты, которая поднимает другой вопрос - если Pixel Bender работает только с определенными картами, как вы узнаете во время выполнения из Flex / AS3, есть ли на компьютере браузера поддерживаемая карта.)

Но в любом случае, мой главный вопрос заключается в том, как выполнить эту небольшую побитовую операцию выше в Flex / AS3. (Это должно быть так же быстро, как BlendModes).

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Я не очень опытен в использовании побитовых операций, но я собрал быстрый тестовый пример с использованием новых 10 векторов Flash Player, которые очень хороши для такого типа обработки данных.

Он проходит через 2000x2000 пикселей за 115 мс с использованием автономного проигрывателя отладки на моем компьютере, скорее всего, он будет немного быстрее в проигрывателе релизов.

Я не уверен, что это достаточно быстро, так как я не знаю, как часто или на каких изображениях вам нужно его запускать, но это может быть, по крайней мере, отправной точкой.

package  {
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.utils.getTimer;
    /**
     * ...
     * @author Martin Jonasson
     */
    public class Test extends Sprite {

        public function Test() {

            var output:TextField = new TextField();
            output.autoSize = "left";
            addChild(output);

            var bmpB:BitmapData = new BitmapData(2000, 2000, false, 0xff00ff);
            var bmpS:BitmapData = new BitmapData(2000, 2000, false, 0xffffff);
            var bmpF:BitmapData = new BitmapData(2000, 2000, false, 0x000000);

            var rect:Rectangle = new Rectangle(0, 0, 2000, 2000)

            var vecB:Vector.<uint> = bmpB.getVector(rect);
            var vecS:Vector.<uint> = bmpS.getVector(rect);
            var vecF:Vector.<uint> = bmpF.getVector(rect);

            var vecFinal:Vector.<uint> = new Vector.<uint>(vecB.length, true);

            var startTime:int = getTimer();
            for (var i:int = vecB.length - 1; i >= 0; --i) {
                vecFinal[i] = (vecB[i] & vecS[i]) | (vecF[i] & ~vecS[i]);
            }
            output.appendText("bitwise stuff done, took: " + (getTimer() - startTime) + "ms \n");

            startTime = getTimer();
            var bmpFinal:BitmapData = new BitmapData(2000, 2000, false);
            bmpFinal.setVector(rect, vecFinal);
            output.appendText("created bitmapdata, took: " + (getTimer() - startTime) + "ms \n");

        }

    }

}
0 голосов
/ 23 сентября 2009

к грейпфруту:

При использовании растровых изображений 1000X1000 на моей системе это 47 мс, так что это выглядит очень многообещающе (можно было бы ожидать приближения к стандартной частоте обновления с некоторыми настройками).

Сначала я изучил Flex 2, поэтому не знал о Векторах, которые, очевидно, являются просто высокоэффективными однотипными массивами.

Мне нужно в какой-то момент начать платить вперед, потому что этот форум восхитителен (4 из 4 на некоторые довольно неясные вопросы, так как я впервые узнал об этом 10 дней назад.)

Еще раз спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...