На одном из форумов, видел тему про удаление фона из видео прямо во Flash Player’е и решил попробовать сделать фильтр с помощью PixelBender:

Удаляем фон (нужна камера) Необходима разница в контрасте между фоном и изображением.

1. Качаем Pixel Bender последней версии с сайта Adobe (в нем появилась документация по всем функциям и синтаксису языка)

2. Пишем сам фильтр (у меня самый простой вариант для любого фона, работает плохо, если кто знает другой алгоритм, отпишите в комментариях) Суть такова: есть фон, и изображение из которого фон надо исключить. Сравниваем цвет пикселя фона с изображением. Берем расстояние от точки фона с координатами (r,g,b) до точки изображения. Если расстояние не превышает определенного числа (чувствительности), делаем пиксель полностью прозрачным.

kernel GreenScene
< namespace: "GreenScene";
vendor: "atflash.ru";
version: 1;
>
{
input image4 src;
input image4 background;
parameter float sensivity;
output pixel4 result;
void evaluatePixel()
{
pixel4 fp = sample( src, outCoord() );
pixel4 bp = sample( background, outCoord() );
float diff = sqrt(pow((fp.r-bp.r),2.0)+pow((fp.g-bp.g),2.0)+pow((fp.b-bp.b),2.0));
result = fp;
result.a =  step(sensivity,diff/sqrt(3.0));
}

}

Все что идет до первой “{” обязательно и включает описание фильтра. Далее идут параметры передаваемые фильтру, а именно src (изображение Спрайта или другого DisplayObject’а на которое накладывается фильтр – передается в фильтр автоматически), background – BitmapData с фоном, и sensivity – чувствительность от 0 до 1. Затем описывается основная функция evaluatePixel, которая срабатывает src.width * src.height раз, и координаты текущей точки которой можно узнать с помощью outCoord() функции. Функция sample подобно функции getPixel32 (getPixel – для трёхканальных вычислений) возвращает объект типа pixel4 {a: alpha, r: red, g:green, b:blue}. Затем используя некоторые стандартные функции, о которых можно почитать в документации, мы получаем прозрачность текущего пикселя. Выполняем и компилируем код в pbj для FlashPlayer’а

3. Я хотел, сделать автономный класс для фильтра и поэтому воспользовался PBJ String Generator v1.1 – программой, для представления байтовых данных в текстовом формате. Для обратного конвертирования можно использовать функцию:

private function decode(str:String):ByteArray {
var temp:String = "";
var ba:ByteArray = new ByteArray();
for (var i:uint = 0; i < str.length / 2; i++) {
temp = str.substr(i * 2, 2);
ba.writeByte(parseInt(temp, 16) - 0x80);
}

return ba;

}

Исходники примера можно скачать здесь.

При создании флеш презентаций с помощью прожектора зачастую стандартное меню оказывается лишним. Его можно убрать с помощью подходящего редактора ресурсов. Можно воспользоваться Resource Builder или, например, идущим с visual studio встроенным редактором. Я буду использовать Resource Builder.

Для начала откроем FlashPlayer.exe (лучше сделать копию) и начнем ковырять его. Сначала настроим сочетания клавиш. Переходим в пункт Accelerators и редактируем поля, как показано на рисунке:

Затем из пункта Menu удаляем все подпункты кроме 610 и 613 английского языка. В пункте String меняем значение заголовка флеш плеера для каждого используемого языка. Можно оставить pop-up меню с пунктом “About Flash Player” и отредактировать текстовые поля в Dialog. Также меняем иконку.

Теперь открываем наш отредактированный прожектор, открываем swf с помощью ctrl+O, а затем сохраняем прожектор (ctrl+S)

ExternalInterface VisualBasic

Ноябрь 11, 2008

Поискав в документации, я не обнаружил объяснения как работать с ExternallInterface через activeX компонент в собственном приложении, поэтому решил дать некоторые разъяснения на примере взаимодействия с Visual Basic 2008.

Сначала флеш:

package {
   import flash.display.Sprite;
   import flash.external.ExternalInterface;

   public class Main extends Sprite {

      public function Main() {
         ExternalInterface.addCallback("getFromVB", getFromVB);
         ExternalInterface.call("sendToVB", "VB, Hello");
      }

      public function getFromVB(val:String):void {
         //Здесь здесь работаем с val из VisualBasic
      }
   }

}

Теперь Visual Basic. Добавляем flash activeX на панель инструментов (Правая кнопка > Choose items> Browse..) из C:\Windows\System32\Macromed\Flash а затем на сцену (я назвал его MainMovie):

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   MainMovie.LoadMovie(0, Application.StartupPath + "\test.swf")
End Sub

Private Sub MainMovie_FlashCall(ByVal sender As Object, ByVal e As AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent) Handles MainMovie.FlashCall
   'сюда приходит флеш запрос  из call метода
   MsgBox (e.request)

   'Отправляем обратно
   MainMovie.CallFunction('<invoke name="getFromVB"><arguments><string>Hi, Flash</string></arguments></invoke>')
End Sub

В окошке сообщения в Visual Basic мы увидим:

VB, Hello

Все это с легкостью можно повторить в любом другом IDE.