Pixel Bender пишем свой фильтр
Март 22, 2009
На одном из форумов, видел тему про удаление фона из видео прямо во 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;
}
Исходники примера можно скачать здесь.
Модификация Flash Player’а
Ноябрь 29, 2008
При создании флеш презентаций с помощью прожектора зачастую стандартное меню оказывается лишним. Его можно убрать с помощью подходящего редактора ресурсов. Можно воспользоваться 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.
