本页面由 Flash 保存计划 从 Internet Archive 存档还原 · 快照 2006-07-08 · 原址 http://www.flash8.net/teach/3755.htm ← Flash 保存计划

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 );

这样一个实例,其实就是形成一个,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 );


点击浏览该文件
点击浏览该文件
   责任编辑:uufeng    时间:2005年8月19日
  • 最近更新

正在加载评论...