使用 BitmapData 类创建位图

BitmapData 类允许您在运行时创建任意大小的透明或不透明位图图像并采用各种方式操作这些图像。当您使用 ActionScript 直接操作 BitmapData 实例时,可以创建非常复杂的图像,而不会带来不断从 Flash Player 中的矢量数据中重绘内容的开销。BitmapData 类的方法支持多种无法通过通用 Flash 工作区的"滤镜"选项卡获得的效果。

BitmapData 对象包含像素数据的数组。此数据既可以表示完全不透明的位图,也可以表示包含 Alpha 通道数据的透明位图。以上任一类型的 BitmapData 对象都作为 32 位整数的缓冲区进行存储。每个 32 位整数确定位图中单个像素的属性。每个 32 位整数都是四个 8 位通道 值(从 0 到 255)的组合,这些值描述像素的 Alpha 透明度值和红、绿、蓝 (ARGB) 值。

有关使用包的信息,请参见使用滤镜包

提供了使用 BitmapData 类操作图像的范例源文件。在硬盘上的 Samples 文件夹中可以找到名为 BitmapData.fla 的文件。

下面的过程将一个 JPEG 图像动态加载到舞台上,并使用 BitmapData 类创建杂点效果,类似于电视中的静电干扰效果。每隔 100 毫秒(一秒的 1/10),都将以随机模式重新绘制该杂点效果。沿 x 轴和 y 轴移动鼠标指针将影响每个间隔内绘制的静电干扰量。

使用 BitmapData 类创建杂点效果:

  1. 创建一个新的 Flash 文档,并将它保存为 noise.fla
  2. 将下面的 ActionScript 添加到时间轴中的第 1 帧:
    import flash.display.BitmapData;
    this.createTextField("status_txt", 90, 0, 0, 100, 20);
    status_txt.selectable = false;
    status_txt.background = 0xFFFFFF;
    status_txt.autoSize = "left";
    function onMouseMove() {
        status_txt._x = _xmouse;
        status_txt._y = _ymouse-20;
        updateAfterEvent();
    }
    this.createEmptyMovieClip("img_mc", 10);
    img_mc.loadMovie("http://www.helpexamples.com/flash/images/image1.jpg");
    var noiseBmp:BitmapData = new BitmapData(Stage.width, Stage.height, true);
    this.attachBitmap(noiseBmp, 20);
    setInterval(updateNoise, 100);
    var grayScale:Boolean = true;
    function updateNoise():Void {
        var low:Number = 30 * _xmouse / Stage.width;
        var high:Number = 200 * _ymouse / Stage.height;
        status_txt.text = "low:" + Math.round(low) + ", high:" + Math.round(high);
        noiseBmp.noise(Math.round(Math.random() * 100000), low, high, 8, true);
    }
    

    此代码使用实例名称 status_txt 创建一个文本字段,该字段跟随鼠标指针并为 noise() 方法显示 highlow 参数的当前值。setInterval() 函数可更改杂点效果,杂点效果通过连续调用 updateNoise() 函数每隔 100 毫秒(一秒的 1/10)更新一次。noise() 方法的 highlow 参数通过计算指针在舞台上的当前位置来确定。

  3. 选择"控制">"测试影片"来测试该文档。

    沿 x 轴移动鼠标指针将影响 low 参数;而沿 y 轴移动鼠标指针将影响 high 参数。

BitmapData 类还允许您通过结合使用 perlinNoise() 方法效果和置换图滤镜来使动态加载的图像扭曲。下面的过程将显示这一效果。

将置换图滤镜应用于图像:

  1. 创建一个新的 Flash 文档,并将它保存为 displacement.fla
  2. 将下面的 ActionScript 添加到时间轴中的第 1 帧:
    // 导入类。
    import flash.filters.DisplacementMapFilter;
    import flash.display.BitmapData;
    import flash.geom.Point;
    // 创建剪辑和嵌套剪辑。
    var shapeClip:MovieClip = this.createEmptyMovieClip("shapeClip", 1);
    shapeClip.createEmptyMovieClip("holderClip", 1);
    // 加载 JPEG。
    var imageLoader:MovieClipLoader = new MovieClipLoader();
    imageLoader.loadClip("http://www.helpexamples.com/flash/images/image4.jpg", shapeClip.holderClip);
    // 创建 BitmapData 实例。
    var perlinBmp:BitmapData = new BitmapData(Stage.width, Stage.height);
    perlinBmp.perlinNoise(Stage.width, Stage.height, 10, Math.round(Math.random() * 100000), false, true, 1, false);
    // 创建并应用置换图滤镜。
    var displacementMap:DisplacementMapFilter = new DisplacementMapFilter(perlinBmp, new Point(0, 0), 1, 1, 100, 100, "color", 1);
    shapeClip.filters = [displacementMap];
    // 创建并应用侦听器。
    var mouseListener:Object = new Object();
    mouseListener.onMouseMove = function():Void {
      perlinBmp.perlinNoise(Stage.width, Stage.height, 10, Math.round(Math.random() * 100000), false, true, 1, false);
      shapeClip.filters = [displacementMap];
    }
    Mouse.addListener(mouseListener);
    

    此代码示例由五个逻辑部分组成。第一部分导入示例必需的类。第二个代码块创建一个嵌套的影片剪辑并从远程服务器加载一个 JPEG 图像。第三个代码块创建一个名为 perlinBmp 的新 BitmapData 实例,该实例与舞台尺寸大小相同。perlinBmp 实例包含 Perlin 杂点效果的结果,稍后会将该实例用作置换图滤镜的参数。第四个代码块将创建置换图滤镜效果并将其应用于前面创建的动态加载的图像。第五个也是最后一个代码块为鼠标创建一个侦听器,只要用户移动鼠标指针,就将重新生成置换图滤镜使用的 Perlin 杂点。

  3. 选择"控制">"测试影片"对该 Flash 文档进行测试。