ConvolutionFilter类的用法
作者:holybozo 类型:原创 来源:闪吧
flash.filters.ConvolutionFilter
以帮助上的话,ConvolutionFilter类是应用一个矩阵环绕滤镜,通过一张图片中某个象素周围的象素互相影响后产生新的图片,这样可以达到很多类似,模糊,斜边,锐化等等效果....
它为什么会这么神奇呢?
先看看ConvolutionFilter(以下简称CF)的构造函数的参数表
ConvolutionFilter(
matrixX:Number,
matrixY:Number,
matrix:Array,
divisor:Number,
bias:Number,
preserveAlpha:Boolean,
clamp:Boolean,
color:Number,
alpha:Number)
matrixX: 矩阵的实际列数
matrixY: 矩阵的实际行数
matrix: 数据
divisor: 一个系数做除数用
bias: 一个系数做增量用
preserveAlpha: 是否牵涉到alpha通道,默认为true
clamp: 是否该图片的边缘不受color参数的影响,默认为true
color: 如果clamp为true,那么此参数作为影响图片边缘的颜色,默认为0
alpha: 一个替换色的alpha百分比
以上就是构造函数的参数列表,bias以后的暂时不谈,那么bias以前包括bias在内的这些参数,是如何达到过滤一张图片实现众多效果的呢?
帮助里面给出了一个公式,假设第三个参数matrix是一个3x3的矩阵,那么公式如下
dst (x, y) = ((src (x-1, y-1) * a0 + src(x, y-1) * a1.... src(x, y+1) * a7 + src (x+1,y+1) * a8) / divisor) + bias
dst就是最终(x,y)象素上的颜色,src是原始图片的颜色,可以看出,这个公式,是把一张图片的,某个象素周围的9个象素,经过矩阵数组内的系数之和,除以divisor参数,再加上增量bias
换句话说,一个象素上的色值,和它周围象素有着如公式一样的一个关系,如何来让这个公式发挥作用,关键就是传进去的参数,而参数如何取值,这就是数学问题咯,hoho.......我数学烂,在这里也只能提到一点点关系
比如
var mx:Number = 3;
var my:Number = 3;
var matrix:Array =
[1,1,1,
1,1,1,
1,1,1];
var divisor = 9;
var bias = 0;
var cf:ConvolutionFilter = new ConvolutionFilter( mx, my, matrix, divisor, bias );
var my:Number = 3;
var matrix:Array =
[1,1,1,
1,1,1,
1,1,1];
var divisor = 9;
var bias = 0;
var cf:ConvolutionFilter = new ConvolutionFilter( mx, my, matrix, divisor, bias );
这样一个实例,其实就是形成一个,3x3的矩阵,矩阵内元素统统为1,除数为9,增量为0,意思就是,某个象素的值,等于周围9个象素值的平均值,这样是一个什么效果呢,就是一个模糊效果^^_
另外,虽然这些参数是任意的,但是帮助里面强调几点
1>矩阵最好是一个3x3的,这个很好理解,因为一个象素算自己最多就是9个点
2>矩阵元素取值范围-127~127
3>元素之和的绝对值小于等于127
4>如果元素中有负数,除数必须在2.00001到256之间
5>如果元素都是负数,除数可以在1.1到256之间
6>增量bias必须是个整数
以下是一个模糊图片的小例子,大家可以自由改变里面的参数,看看会产生什么效果(另:本人才学疏浅,哪有高人能更好更详细的讲解,或者提出意见,非常欢迎!!!!!!!)
工具:flash 7 or 8(注:7的话,看置顶贴,如何发布成8)
导入一张图片,包入一mc,左上角对齐,拖入场景,命名image_mc,第一帧写如下程序
// 导入相关类
import flash.geom.*;
import flash.display.BitmapData;
import flash.filters.ConvolutionFilter;
// 获得图片的宽,高
var width:Number = image_mc._width;
var height:Number = image_mc._height;
// 建造位图对象
var image:BitmapData = new BitmapData( width, height, false, 0);
var dest:BitmapData = new BitmapData( width, height, false, 0);
// 加载位图
var screen:MovieClip = createEmptyMovieClip("screen", 0);
screen.attachBitmap(dest, 0);
// 把图像画入位图
image.draw(image_mc);
//image_mc._visible = false;
// 对位图应用滤镜
var bound:Rectangle = new Rectangle(0,0,width, height);
var origin:Point = new Point(0,0);
var blur:ConvolutionFilter = new ConvolutionFilter(3,3, [1,1,1,1,1,1,1,1,1], 9,0);
dest.applyFilter( image, bound, origin, blur );
import flash.geom.*;
import flash.display.BitmapData;
import flash.filters.ConvolutionFilter;
// 获得图片的宽,高
var width:Number = image_mc._width;
var height:Number = image_mc._height;
// 建造位图对象
var image:BitmapData = new BitmapData( width, height, false, 0);
var dest:BitmapData = new BitmapData( width, height, false, 0);
// 加载位图
var screen:MovieClip = createEmptyMovieClip("screen", 0);
screen.attachBitmap(dest, 0);
// 把图像画入位图
image.draw(image_mc);
//image_mc._visible = false;
// 对位图应用滤镜
var bound:Rectangle = new Rectangle(0,0,width, height);
var origin:Point = new Point(0,0);
var blur:ConvolutionFilter = new ConvolutionFilter(3,3, [1,1,1,1,1,1,1,1,1], 9,0);
dest.applyFilter( image, bound, origin, blur );
点击浏览该文件
点击浏览该文件
责任编辑:uufeng 时间:2005年8月19日
- 上一篇:
- 《闪E》FLASH电子期刊第12期
- 下一篇:
- [flash8教程]动态模糊效果
- 没有相关教材
- 最近更新
