8.14.在两幅位图之间转换

问题
我要从一幅位图中淡出到另一幅位图
解决办法
使用BitmapData类的pixelDissolve( )方法
讨论
和许多BitmapData 方法类似,pixelDissolve( ) 使用一个原位图和目标位图,每次调用时,从原位图上拷贝指定数量随机位置的像素到目标位图上,要完成转换,须重复调用,因此可以放在enterFrame事件处理函数里或基于时间的函数。

第一次调用pixelDissolve( )方法时,通过随机种子产生随机位置的像素拷贝,返回的值可以作为下一次的随机种子
该方法语法:
+展开
-ActionScript
seed = srcBmp.pixelDissolve(destBmp, sourceRect, destPoint,
seed, numPixels, fillColor);

sourceRect 和destPoint 参数与BitmapData 的其他方法一样,seed 在第8.10节讲过。
numPixels 参数决定一次拷贝多少像素
fillColor 提供更简单的方法从单个位图淡出到指定颜色,如果你的原位图和目标位图一样,做转换是无效果的,这时就要用这个参数来填充颜色。

第一个例子使用两幅位图,一幅白色,一幅黑色,每帧拷贝1000个像素:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.geom.Point;
public class Dissolve extends Sprite {
private var _bitmap:BitmapData;
private var _bitmap2:BitmapData;
private var _image:Bitmap;
private var _seed:Number;
private var _pixelCount:int = 0;
public function Dissolve( ) {
_bitmap = new BitmapData(stage.stageWidth,
stage.stageHeight,
false, 0xffffffff);
_bitmap2 = new BitmapData(stage.stageWidth,
stage.stageHeight,
false, 0xff000000);
_image = new Bitmap(_bitmap);
addChild(_image);
_seed = Math.random( ) * 100000;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
_seed = _bitmap.pixelDissolve(_bitmap2,
_bitmap.rect,
new Point( ),
_seed,
1000);
_pixelCount += 1000;
if(_pixelCount > _bitmap.width * _bitmap.height) {
removeEventListener(Event.ENTER_FRAME,
onEnterFrame);
}
}
}
}

这里我们注意到pixelDissolve( ) 方法本身不会判断是否已经转换完成,也就说像素已经拷贝完毕了,这时我们需要通过每次的像素拷贝数来计算什么时候完成转换,也就是拷贝的像素总数是否等于位图的总像素数(位图的长*位图的宽)。

下面的例子,把同样的位图作为源和目标,黑色作为填充色:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.geom.Point;
public class Dissolve2 extends Sprite {
private var _bitmap:BitmapData;
private var _image:Bitmap;
private var _seed:Number;
private var _pixelCount:int = 0;
public function Dissolve2( ) {
_bitmap = new BitmapData(stage.stageWidth,
stage.stageHeight,
false,
0xffffffff);
_image = new Bitmap(_bitmap);
addChild(_image);
_seed = Math.random( ) * 100000;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
_seed = _bitmap.pixelDissolve(_bitmap,
_bitmap.rect,
new Point( ),
_seed,
1000,
0xff000000);
_pixelCount += 1000;
if(_pixelCount > _bitmap.width * _bitmap.height)
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
}
}

这种效果经常应用到两个照片之间的切换,如果想加快转换速度可以调大numPixels 参数值:
+展开
-ActionScript
var numPixels:Number = _bitmap.width * _bitmap.height / 100;
_seed = _bitmap.pixelDissolve(_bitmap,
_bitmap.rect,
new Point( ),
_seed,
numPixels,
0xff000000);
_pixelCount += numPixels;

每次拷贝1% 的总像素数,如果是30 帧播放的话,也就3 秒钟即可转换完成。

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


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