8.13.在位图上应用滤镜

问题
我要在BitmapData上加上滤镜效果
解决办
使用BitmapData类的applyFilter( ) 方法
讨论
有两种方法应用滤镜到位图上,第一种方法是使用直接调用BitmapData的applyFilter( )方法。和其他方法一样,它需要目标位图,而且也可以把其他BitmapData 作为原位图:
+展开
-ActionScript
destBmp.applyFilter(srcBmp, sourceRect, destPoint, filter);

srcBmp 参数表示目标位图
sourceRect 参数指定滤镜应用到的区域
destPoint 参数表示其实坐标
filter参数即滤镜,它是BitmapFilter 实例

基于原始内容和滤镜参数,每个像素值都被重新计算,然后把这些值覆盖掉原始像素数据The

比如下面的例子,在鼠标周围随即设置100个白色的像素点,然后应用模糊滤镜,每一帧重复执行,当鼠标离开白色点在鼠标周围不断生成,再移动鼠标,原来地方的白色经过模糊滤镜然后慢慢消失:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.filters.BlurFilter;
import flash.events.Event;
import flash.geom.Point;
public class FilteredBitmap extends Sprite {
private var _bitmap:BitmapData;
private var _image:Bitmap;
private var _blurFilter:BlurFilter;
public function FilteredBitmap( ) {
_bitmap = new BitmapData(stage.stageWidth, stage.stageHeight,
false, 0xff000000);
_image = new Bitmap(_bitmap);
addChild(_image);
_blurFilter = new BlurFilter( );
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
for(var i:int = 0; i < 100; i++) {
_bitmap.setPixel(mouseX + Math.random( ) * 20 - 10,
mouseY + Math.random( ) * 20 - 10,
0xffffffff);
}
_bitmap.applyFilter(_bitmap, _bitmap.rect, new Point( ), _blurFilter);
}
}
}

正如你说看到的那样,有损方法是如此有创造性,现在对比下无损方法,它使用两个位图,一个为原位图,一个为目标位图,滤镜应用在原位图上,把结果存在目标位图上,这就是无损的,因为滤镜不会改变原位图的像素值:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.filters.BlurFilter;
import flash.events.Event;
import flash.geom.Point;
public class FilteredBitmap2 extends Sprite {
private var _bitmap:BitmapData;
private var _bitmap2:BitmapData;
private var _image:Bitmap;
private var _blurFilter:BlurFilter;
public function FilteredBitmap2( ) {
_bitmap = new BitmapData(stage.stageWidth, stage.stageHeight,
false, 0xff000000);
_bitmap2 = new BitmapData(stage.stageWidth, stage.stageHeight,
false, 0xff000000);
_image = new Bitmap(_bitmap);
addChild(_image);
_blurFilter = new BlurFilter( );
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
for(var i:int = 0; i < 100; i++) {
_bitmap2.setPixel(mouseX + Math.random( ) * 20 - 10,
mouseY + Math.random( ) * 20 - 10,
0xffffffff);
}
_bitmap.applyFilter(_bitmap2, _bitmap.rect, new Point( ), _blurFilter);
}
}
}

另一个应用滤镜的方法就是Bitmap的filters属性来控制BitmapData。这是另一种应用滤镜的无损方法,它不会直接接触BitmapData的像素数据,因为滤镜只应用在包装BitmapData的Bitmap上,看下面的代码:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.filters.BlurFilter;
import flash.events.Event;
public class FilteredBitmap3 extends Sprite {
private var _bitmap:BitmapData;
private var _image:Bitmap;
public function FilteredBitmap3( ) {
_bitmap = new BitmapData(stage.stageWidth, stage.stageHeight,
false, 0xff000000);
_image = new Bitmap(_bitmap);
addChild(_image);
_image.filters = [new BlurFilter( )];
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
for(var i:int = 0; i < 100; i++) {
_bitmap.setPixel(mouseX + Math.random( ) * 20 - 10,
mouseY + Math.random( ) * 20 - 10,
0xffffffff);
}
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(110)喜欢(0)flash/flex/fcs/AIR