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;
}
Исходники примера можно скачать здесь.
Комментировать