当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > Flash as入门(15):filters类滤镜

ActionScript
FLASH 3D相册之利用BitmapData类制作
Flash 脚本游戏开发教程 第一课
Flash 脚本游戏开发教程第二课
Flash 脚本游戏开发教程第三课
Flash 脚本游戏开发教程第四课
Flash 脚本游戏开发教程第五课
Flash 脚本游戏开发教程第六课
Flash 脚本游戏开发教程第七课
Flash 脚本游戏开发教程第八课
Flash AS实现的蝌蚪摆尾动画的教程
从基础开始深入学Flash AS3教程(4)(译文)
从基础开始深入学Flash AS3教程(5)(译文)
从基础开始深入Flash AS3教程(2)(译文)
从基础开始深入学Flash AS3教程(3)(译文)
Flash AS3对单个图片进行角色动作化处理
从基础开始深入Flash AS3教程(1)(译文)
Flash教程:if条件语句的用法
Flash AS教程:_visible属性的详细讲解
Flash AS教程:图片环绕旋转效
Flash教程:trace()的使用

ActionScript 中的 Flash as入门(15):filters类滤镜


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-01   浏览: 797 ::
收藏到网摘: n/a

本例继续讲解AS的基础知识,今天我们来学习Flash AS入门系列教程第七课:影片剪辑第9节使用滤镜,教程详细讲解了Flash的filters类为我们提供的9种滤镜效果,并用实例作了说明,对Flash的AS编程有兴趣的朋友可以到论坛与作者交流。

用AS实现滤镜效果、

使用滤镜

Flash的filters类为我们提供了9种滤镜效果,要用AS实现滤镜效果,首先仍然需导入filters类:
import flash.filters.*;

然后,使用new构造函数,创建一个filters对象,并将它赋值给MC(或文本或按钮)的filters属性从而实现滤镜效果。

下面分别介绍这些滤镜效果:


1. 模糊滤镜:BlurFilter

BlurFilter类可以带来模糊的效果。要创建BlurFilter实例可用下面的方法:
var filter: BlurFilter = new BlurFilter(blurX, blurY, quality);
在BlurFilter的构造函数中使用了三个参数:
blurX: 水平模糊量。有效值为 0 到 255(浮点值)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
blurY: ― 垂直模糊量。有效值为 0 到 255(浮点值)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
quality: ― 应用滤镜的次数。默认值是 1,即表示低品质。值为 2 表示中等品质,值为 3 表示高品质并且接近高斯模糊。
下面还是用一个练习来熟悉模糊滤镜的应用。
导入一张图片将它做成MC,放到舞台上,实例名称为:my_mc.
然后打开帧动作面板,输入下列代码:

import flash.filters.*
var filter:BlurFilter = new BlurFilter(8,8,3);
my_mc.filters = [filter];

测试影片,这时图片已变模糊了。效果如下:

我们甚至可以在运行时改变模糊滤镜的参数,使模糊效果是可变的,比如根据鼠标的位置产生不同的模糊效果。将代码改成下面的:

import flash.filters.*
var filter:BlurFilter = new BlurFilter(8,8,3);
my_mc.filters = [filter];
onMouseMove = function() {
bx = Math.abs(_xmouse - my_mc._x);
by = Math.abs(_ymouse - my_mc._y);
filter.blurX = bx/10;
filter.blurY = by/10;
my_mc.filters = [filter];
}

测试影片,当鼠标移动时,模糊效果发生变化,鼠标距图片中心越远,模糊效果越深。效果如下:

2. 投影滤镜:DropShadowFilter

DropShadowFilter滤镜将产生投影的效果。要创建投影滤镜可用:
var filter: DropShadowFilter = new DropShadowFilter(distance, angleInDegrees,color,alpha,blurX,blurY,strength,quality,inner,knockout,hideObject);

投影影滤镜的参数比较多哈,还是一个一个介绍一下:

distance:― 阴影的偏移距离,以像素为单位。默认值是 4(浮点)。
angle:― 阴影的角度,0 到 360˚(浮点)。默认值是 45。
color:― 阴影颜色,采用十六进制格式 0xRRGGBB。默认值是 0x000000。
alpha:― 阴影颜色的 Alpha 透明度值。有效值为 0 到 1。例如,0.25 设置透明度值为 25%。默认值是 1。
blurX:― 水平模糊量。有效值为 0 到 255(浮点)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
blurY:― 垂直模糊量。有效值为 0 到 255(浮点)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
strength:― 压印或跨页的强度。该值越高,压印的颜色越深,而且阴影与背景之间的对比度也越强。有效值为 0 到 255。默认值是 1。
quality:― 应用滤镜的次数。有效值为 0 到 15。默认值是 1,它表示低品质。值为 2 表示中等品质,值为 3 表示高品质。
inner:― 表示阴影是否为内侧阴影。值 true 指定内侧阴影。默认为 false,即外侧阴影,它表示对象外缘周围的阴影。
knockout:― 应用挖空效果 (true),这将有效地使对象的填色变为透明,并显示文档的背景颜色。默认值是 false,即不应用挖空效果。
hideObject:― 表示是否隐藏对象。如果值为 true,则表示没有绘制对象本身,只有阴影是可见的。默认值是 false(显示对象)。

做个练习,将上面练习的代码改为:

import flash.filters.*
var filter:DropShadowFilter = new DropShadowFilter();
my_mc.filters = [filter];

测试影片,效果如下:图片产生了投影效果。因为投影滤镜的所有参数都是可选的,所以我们没有给任何参数,即都使用默认值。

同样的我们可以在运时改变投影的参数,从而改变效果。我们将这个效果改变加在图片的点击事件上,即点击图片投影效果发生改变。这里改变了三个参数,偏移量,颜色(随机)和角度。

效果:

代码如下:

import flash.filters.*
var filter:DropShadowFilter = new DropShadowFilter();
my_mc.filters = [filter];
var i = 1;
my_mc.onRelease = function():Void {
if(filter.distance<5){
i=1;
} else if (filter.distance>30){
i=-1;
}
filter.distance += i;
filter.color = random(16000000);
filter.angle++;
my_mc.filters = [filter];
}

 

3.发光滤镜:GlowFilter

构造函数:
var filter:GlowFilter = new GlowFilter(color,alpha,blurX,blurY,strength,quality,inner,knockout);

参数:

color:― 光晕颜色,采用十六进制格式 0x RRGGBB。默认值是 0xFF0000。
alpha:― 颜色的 Alpha 透明度值。有效值为 0 到 1。例如,.25 设置透明度值为 25%。默认值是 1。
blurX:― 水平模糊量。有效值为 0 到 255(浮点)。默认值是 6。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,它的呈现速度会比其它值更快。
blurY:― 垂直模糊量。有效值为 0 到 255(浮点)。默认值是 6。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,它的呈现速度会比其它值更快。
strength:― 压印或跨页的强度。该值越高,压印的颜色越深,而且发光与背景之间的对比度也越强。有效值为 0 到 255。默认值是 2。
quality:― 应用滤镜的次数。有效值为 0 到 15。默认值是 1,它表示低品质。值为 2 表示中等品质,值为 3 表示高品质。
inner:― 指定发光是否为内侧发光。值 true 表示内侧发光。默认值是 false,即外侧发光,它表示对象外缘周围的发光。
knockout:― 指定对象是否具有挖空效果。值为 true 将使对象的填充变为透明,并显示文档的背景颜色。默认值是 false(不应用挖空效果)。

效果:点击图片效果发生变化。

代码如下:

import flash.filters.*
var filter:GlowFilter = new GlowFilter();
my_mc.filters = [filter];
var i = 1;
var j =0.1;
my_mc.onRelease = function():Void {
if(filter.blurX<5){
i=1;
} else if (filter.blurX>250){
i=-1;
}
if(filter.alpha < 3){
j =0.1;
} else if(filter.alpha >8){
j=-0.1;
}
filter.blurX += i;
filter.blurY += i;
filter.color = random(16000000);
filter.alpha += j;
my_mc.filters = [filter];
}

4. 渐变发光滤镜:GradientGlowFilter

构造函数:
var filter:GradientGlowFilter = new GradientGlowFilter(distance,angleInDegrees, colors, alphas, ratios, blurX, blurY, strength, quality, type, knockout);

参数:
distance:― 光晕的偏移距离。默认值为 4。
angle:― 角度,以度为单位。有效值为 0 到 360。默认值是 45。
colors: ― 定义渐变的颜色的数组。例如,红色为 0xFF0000,蓝色为 0x0000FF,依此类推。
alphas: ― colors 数组中对应颜色的 Alpha 透明度值的数组。数组中每个元素的有效值为 0 到 1。例如,值为 .25 设置 Alpha 透明度值为 25%。
ratios: ― 颜色分布比例的数组。有效值为 0 到 255。该值定义宽度的百分比,颜色采样率为 100%。
blurX: ― 水平模糊量。有效值为 0 到 255。如果模糊量小于等于 1,则表明原始图像是按原样复制的。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
blurY:― 垂直模糊量。有效值为 0 到 255。如果模糊量小于等于 1,则表明原始图像是按原样复制的。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
strength: ― 压印或跨页的强度。该值越高,压印的颜色越深,而且发光与背景之间的对比度也越强。有效值为 0 到 255。值越大,压印越强。值为 0 意味着未应用滤镜。默认值是 1。
quality: ― 应用滤镜的次数。有效值为 0 到 15。默认值是 1,它表示低品质。值为 2 表示中等品质,值为 3 表示高品质。
type: ― 滤镜效果的放置。可能的值包括:
"outer":对象外缘上的发光
"inner":对象内缘上的发光;默认值
"full":对象顶部的发光

效果:

代码:

import flash.filters.*
var filter:GradientGlowFilter = new GradientGlowFilter();
filter.colors = [0xFFFFFF, 0xFF0000, 0xFFFF00, 0x00CCFF];
filter.alphas = [0.3, 0.5, 0.5, 0.5];
filter.ratios = [0, 63, 126, 255];
filter.blurX = 50;
filter.blurY = 50;
filter.type = "outer";
my_mc.filters = [filter];

5. 斜角滤镜:BevelFilter(斜角滤镜可产生三维效果。)

构造函数:
var filter:BevelFilter = new BevelFilter(distance, angleInDegrees, highlightColor, highlightAlpha, shadowColor, shadowAlpha, blurX, blurY, strength, quality, type, knockout);

参数:
distance:― 斜角的偏移距离,以像素为单位(浮点)。默认值是 4。
angle:― 斜角的角度,0 至 360 度。默认值是 45。
highlightColor:― 斜角的加亮颜色 0xRRGGBB 。默认值是 0xFFFFFF。
highlightAlpha: ―加亮颜色的 Alpha 透明度值。有效值为 0 到 1。例如,.25 设置透明度值为 25%。默认值是 1。
shadowColor:― 斜角的阴影颜色 0xRRGGBB 。默认值是 0x000000。
shadowAlpha: ― 阴影颜色的 Alpha 透明度值。有效值为 0 到 1。例如,0.25 设置透明度值为 25%。默认值是 1。
blurX: ― 水平模糊量,以像素为单位。有效值为 0 到 255(浮点)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
blurY: ― 垂直模糊量,以像素为单位。有效值为 0 到 255(浮点)。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
strength: ― 压印或跨页的强度。该值越大,压印的颜色越深,而且斜角与背景之间的对比度也越强。有效值为 0 到 255。默认值是 1。
quality: ― 应用滤镜的次数。默认值是 1,即表示低品质。值为 2 表示中等品质,值为 3 表示高品质。
type:― 斜角的类型。有效值为 "inner"、"outer" 和 "full"。默认值为 "inner"。
knockout: ― 应用挖空效果 (true),这将有效地使对象的填色变为透明,并显示文档的背景颜色。默认值是 false(不应用挖空效果)。

效果:

代码:

import flash.filters.*
var filter: BevelFilter = new BevelFilter ();
filter.distance = 8;
filter.highlightColor = 0xcccccc;
my_mc.filters = [filter];

你可以调整其它参数,创建不同的效果。

6. 渐变斜角滤镜:GradientBevelFilter

构造函数:
var filter:GradientBevelFilter = new GradientBevelFilter(distance, angleInDegrees, colors, alphas, ratios, blurY, quality, type, knockout);

参数:

distance: ― 偏移距离。有效值为 0 到 8。默认值为 4。
angle: ― 角度,以度为单位。有效值为 0 到 360。默认值是 45。
colors: ― 渐变中使用的 RGB 十六进制颜色值的数组。例如,红色为 0xFF0000,蓝色为 0x0000FF,依此类推。
alphas: ― colors 数组中对应颜色的 Alpha 透明度值的数组。数组中每个元素的有效值为 0 到 1。例如,.25 设置透明度值为 25%。
ratios: ― 颜色分布比例的数组;有效值为 0 到 255。
blurX: ― 水平模糊量。有效值为 0 到 255。如果模糊量小于等于 1,则表明原始图像是按原样复制的。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
blurY: ― 垂直模糊量。有效值为 0 到 255。如果模糊量小于等于 1,则表明原始图像是按原样复制的。默认值是 4。作为 2 的乘方的值(如 2、4、8、16 和 32)经过了优化,呈现速度比其它值更快。
strength: ― 压印或跨页的强度。该值越高,压印的颜色越深,而且斜角与背景之间的对比度也越强。有效值为 0 到 255。值为 0 表明没有应用滤镜。默认值是 1。
quality: ― 滤镜的质量。有效值为 0 到 15。默认值是 1。几乎在所有情况下,有用值都是 1(低品质)、2(中等品质)和 3(高品质)。滤镜的值越小,呈现速度越快。
type: ― 斜角效果的放置。可能的值包括:
"outer" :对象外缘上的斜角
"inner" :对象内缘上的斜角
"full" :对象顶部的斜角

默认值为 "inner"。

knockout: ― 指定是否应用挖空效果。值为 true 将使对象的填充变为透明,并显示文档的背

效果:

代码:

var filter:GradientBevelFilter = new GradientBevelFilter();
filter.colors = [0x005500,0x005588 ,0xffffff, 0x00aa00];;
filter.alphas= [1,1, 0, 1];
filter.ratios= [0,64, 128, 255];
filter.blurX =20;
filter.blurY= 20;
filter.distance=32;
my_mc.filters =[filter];

7. 矩阵颜色滤镜:ColorMatrixFilter

使用这个滤镜可以将一个4x5的矩阵应到MC(或位图)上,从面改变MC的色相,透明度及亮度等。我想这个滤镜的难点应该是对这个矩阵的理解上。RGB 颜色由红绿蓝三种色组成,矩阵将各像素颜色拆分成红绿蓝三种色另加一个透明度。共四个通道。每个通道由5组值组成这就形成了一个4x5的矩阵。看看下图,来理解一下:

红 绿 蓝 透明度 结果
红色 1 0 0 0 0
绿色 0 1 0 0 0
蓝色 0 0 1 0 0
透明度 0 0 0 N 0(N为0.1-1)

从上面的矩阵中可看出,每个通道在其相应的位置设置了值,最小是0,最大为1,改变这些值就可改变图象的色相及透明度。结果的数值改变可改变图象的亮度。比如将矩阵中红色通道的值由1改为0.5,那么图象中的红色元素将会降低。
在实际应用中,将这个矩阵赋值给一个数组,再将这个数组作为ColorMatrixFilter类构造函数的参数,最后将MC的filters属性设为ColorMatrixFilter类的实例。这同使用其它滤镜一样。

先来做一个增加图片亮度的练习:

效果:

将代码改为:

import flash.filters.*;
var matrix:Array = new Array();
matrix = matrix.concat([1, 0, 0, 0, 100]); // red
matrix = matrix.concat([0, 1, 0, 0, 100]); // green
matrix = matrix.concat([0, 0, 1, 0, 100]); // blue
matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
my_mc.filters = [filter];

测试影片,可以片到图片亮度被增大了很多。这是将矩阵中红绿蓝通道的结果值都改为了100得到的结果。
下面一个练习是动态改变红绿蓝三种色的值,从而改变色相。通过鼠标在屏幕上的位置来确定各颜色的值,当鼠标移动时动态改变。

效果:

代码:

import flash.filters.*;
onMouseMove = function() {
var xPercent:Number = 1 - (_xmouse/Stage.width);
var yPercent:Number = 1 - (_ymouse/Stage.height);
var matrix:Array = new Array();
matrix = matrix.concat([yPercent, 0, 0, 0, 0]); // red
matrix = matrix.concat([0, xPercent, 0, 0, 0]); // green
matrix = matrix.concat([0, 0, xPercent, 0, 0]); // blue
matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
my_mc.filters = [filter];
}

8. 卷积滤镜:ConvolutionFilter

卷积滤镜同样用一个矩阵于图象可形成如模糊、边缘检测、锐化、浮雕和斜角等多种效果。卷积滤镜重新计算每个像素,并根据矩阵将像素及其周围的象素要加得也该像素的新颜色。最常用的矩阵是3x3的矩阵,如下图:
N N N
N P N
N N N

在这个矩阵中P代表本身的像素,而N代表周围的像素。那么下面这个矩阵:
0 0 0
0 1 0
0 0 0

可以看出将这个矩阵用于图象时,图象没有变化,因为除自已外周围的像素均为0,即周围像素对中间的P像素没有影响。

将矩阵存入一个数组,并将它作为ConvolutionFilter类构造函数的一个参数,可实现卷积滤镜效果,除了矩阵参数处ConvolutionFilter构造函数还有其它的一些参数:

matrixX ― 矩阵的 x 维度(矩阵中列的数目)。默认值是 0。
matrixY: ― 矩阵的 y 维度(矩阵中行的数目)。默认值是 0。
matrix: ― 用于矩阵转换的值的数组;返回一个副本。数组中的项数必须等于 matrixX*matrixY。
divisor: ― 矩阵转换中使用的除数。默认值是 1。这个参数如果与矩阵值的总和相等,那么图象的亮度无变化。比如这个矩阵:
0 1 0
1 1 1
0 1 0

里面有5个1,那么矩阵总值为5,如果divisor参设为5,则图象的亮度无变化。如果本参数为1,那么图象的亮度是原图象的5/1倍,这时图象就很亮了。如果本参数为10,那么原图片的亮度为5/10,显然图片就变暗了。

bias: ― 要添加到矩阵转换结果的偏差。默认值是 0。
preserveAlpha: ― 值为 false 表明卷积应用于所有通道,包括 Alpha 通道。值为 true 表示只对颜色通道应用卷积。默认值为 true。
clamp: ― 对于源图像之外的像素,如果值为 true,则表明通过复制输入图像给定边缘处的颜色值,沿着输入图像的每个边框按需要扩展输入图像。如果值为 false,则表明应按照 color 和 alpha 属性中的指定使用其它颜色。默认值是 true。
color: ― 要替换源图像之外的像素的十六进制颜色。
alpha: ― 替换颜色的 Alpha。

下面是几个基本效果的矩阵:

基本模糊(除数 5):
0 1 0
1 1 1
0 1 0

锐化(除数 1):
0, -1, 0
-1, 5, -1
0, -1, 0

边缘检测(除数 1):
0, -1, 0
-1, 4, -1
0, -1, 0

浮雕效果(除数 1):
-2, -1, 0
-1, 1, 1
0, 1, 2

练习:将上面几个矩阵效果应用于图片,点击图片一次,变换一种效果。

效果:

代码:

import flash.filters.*;
var i =0;
my_mc.onRelease = function(){
i++;
if(i>4){
i=1;
}

switch(i){
case 1:
var matrixArr:Array =[0,1,0,1,1,1,0,1,0];
var convolution:ConvolutionFilter = new ConvolutionFilter(3, 3, matrixArr,5);
my_mc.filters = [convolution];
break;
case 2:
var matrixArr:Array = [0, -1, 0,-1, 5, -1, 0, -1, 0];
var convolution:ConvolutionFilter = new ConvolutionFilter(3, 3, matrixArr,1);
my_mc.filters = [convolution];
break;
case 3:
var matrixArr:Array = [0, -1, 0,-1, 4, -1, 0, -1, 0];
var convolution:ConvolutionFilter = new ConvolutionFilter(3, 3, matrixArr,1);
my_mc.filters = [convolution];
break;
case 4:
var matrixArr:Array = [-2, -1, 0,-1, 1, 1,0, 1, 2];
var convolution:ConvolutionFilter = new ConvolutionFilter(3, 3, matrixArr,1);
my_mc.filters = [convolution];
break;

}
}

图片置换滤镜:

mapBitmap: ― 包含置换映射数据的 BitmapData 对象。
mapPoint: ― 一个 flash.geom.Point 值,它包含目标影片剪辑的左上角与映射图像左上角之间的偏移量。
componentX: ― 说明在映射图像中使用哪个颜色通道来置换 x 结果。 可能的值如下所示:
• 1(红色)
• 2(绿色)
• 4 (蓝色)
• 8 (alpha)

componentY: ― 说明在映射图像中使用哪个颜色通道来置换 y 结果。可能的值如下所示:
• 1 (红色)
• 2(绿色)
• 4(蓝色)
• 8 (alpha)

scaleX: ― 用于缩放映射计算的 x 置换结果的乘数。
scaleY: ― 用于缩放映射计算的 y 置换结果的乘数。
mode: [可选] ― 滤镜的模式。可能的值如下所示: 
"wrap" -- 将置换值折返到源图像的另一侧。
"clamp" -- 将置换值锁定在源图像的边缘。 
"ignore" -- 如果置换值超出了范围,则忽略置换并使用源像素。 
"color" -- 如果置换值在图像外,则替换由滤镜的 alpha 属性和 color 属性组成的像素值。
color: [可选] ― 指定对于超出范围的替代应用什么颜色。置换的有效范围是 0.0 到 1.0。如果 mode 设置为 "color",则使用此参数。
alpha: [可选] ― 指定对于超出范围的替换应用什么 Alpha 值。它被指定为 0.0 到 1.0 之间的标准值。例如,0.25 设置透明度值为 25%。默认值是 0。如果 mode 设置为 "color",则使用此参数。

代码:

import flash.filters.DisplacementMapFilter;
import flash.geom.Point;
import flash.display.BitmapData;

var perlinBmp:BitmapData;
var displacementMap:DisplacementMapFilter;
perlinBmp = new BitmapData(my_mc._width, my_mc._height);
perlinBmp.perlinNoise(my_mc._width, my_mc._height, 10, Math.round(Math.random() * 100000), false, true, 1, false);
displacementMap = new DisplacementMapFilter(perlinBmp, new Point(0, 0), 1, 1, 100, 100, "color");
// my_mc.filters = [displacementMap];

my_mc.onRollOver = function():Void {
onEnterFrame = function (){
perlinBmp.perlinNoise(my_mc._width, my_mc._height, 10, Math.round(Math.random() * 100000), false, true, 1, false);
my_mc.filters = [displacementMap];
}
};
my_mc.onRollOut = function(){
delete onEnterFrame;
my_mc.filters = [];
}