Pixel Bender es un lenguaje de programación creado por Adobe que permite aplicar filtros muy potentes a las imágenes aprovechando la potencia de nuestro hardware.
En este caso vamos a hacer el típico desenfoque de zoom. Utilizaremos el filtro de Ryan Phelan.
(Archivo Flash, para verlo necesitas Adobe Flash Player.)
Descargar ejemplo Zoom Blur
Este es el código:
package {
import flash.net.URLLoader;
import flash.display.Shader;
import flash.filters.ShaderFilter;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.events.Event;
import fl.events.SliderEvent;
import flash.display.Sprite;
import flash.external.ExternalInterface;
public class Main extends Sprite{
private var _clip:MovieClip;
private var _loader:URLLoader;
private var _shader:Shader;
private var _zoomFilter:ShaderFilter;
public function Main() {
_clip = clip_mc;
deslizador.visible = false;
loadFilter();
}
// Cargo el filtro
private function loadFilter():void {
_loader = new URLLoader();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
_loader.addEventListener(Event.COMPLETE, filterLoadComplete);
var path:String = this.loaderInfo.loaderURL;
var index:Number = path.lastIndexOf("/");
if(index != -1){
path = path.slice(0, index) + "/";
}else{
path = "";
}
//trace(path);
_loader.load(new URLRequest(path + "zoomBlur.pbj"));
}
// Cuando esta cargado creo el Shader e inicializo algunos valores
private function filterLoadComplete(event:Event):void {
_shader = new Shader(_loader.data);
// valores entre 0 y 2048
_shader.data.center.value = [_clip.width*0.5, _clip.height*0.5];
_zoomFilter = new ShaderFilter(_shader);
// Comienzo a escuchar el evento del deslizador
deslizador.visible = true;
deslizador.addEventListener(SliderEvent.CHANGE, sliderChanged);
}
// Cuando se mueve el deslizador actulizo el filtro y el label del deslizador
private function sliderChanged(e:SliderEvent):void{
updateBlur(e.value);
label.text = String(e.value);
}
// Cambia el valor del desenfoque y refresca el clip
private function updateBlur(amount:Number):void{
// Valores entre 0 y 0.5
_shader.data.amount.value = [amount];
_zoomFilter.shader = _shader;
_clip.filters = [_zoomFilter];
}
}
} |
package {
import flash.net.URLLoader;
import flash.display.Shader;
import flash.filters.ShaderFilter;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.events.Event;
import fl.events.SliderEvent;
import flash.display.Sprite;
import flash.external.ExternalInterface;
public class Main extends Sprite{
private var _clip:MovieClip;
private var _loader:URLLoader;
private var _shader:Shader;
private var _zoomFilter:ShaderFilter;
public function Main() {
_clip = clip_mc;
deslizador.visible = false;
loadFilter();
}
// Cargo el filtro
private function loadFilter():void {
_loader = new URLLoader();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
_loader.addEventListener(Event.COMPLETE, filterLoadComplete);
var path:String = this.loaderInfo.loaderURL;
var index:Number = path.lastIndexOf("/");
if(index != -1){
path = path.slice(0, index) + "/";
}else{
path = "";
}
//trace(path);
_loader.load(new URLRequest(path + "zoomBlur.pbj"));
}
// Cuando esta cargado creo el Shader e inicializo algunos valores
private function filterLoadComplete(event:Event):void {
_shader = new Shader(_loader.data);
// valores entre 0 y 2048
_shader.data.center.value = [_clip.width*0.5, _clip.height*0.5];
_zoomFilter = new ShaderFilter(_shader);
// Comienzo a escuchar el evento del deslizador
deslizador.visible = true;
deslizador.addEventListener(SliderEvent.CHANGE, sliderChanged);
}
// Cuando se mueve el deslizador actulizo el filtro y el label del deslizador
private function sliderChanged(e:SliderEvent):void{
updateBlur(e.value);
label.text = String(e.value);
}
// Cambia el valor del desenfoque y refresca el clip
private function updateBlur(amount:Number):void{
// Valores entre 0 y 0.5
_shader.data.amount.value = [amount];
_zoomFilter.shader = _shader;
_clip.filters = [_zoomFilter];
}
}
}