8.12.使用阈值

问题
我要在位图上基于当前象素值进行修改
解决办法
使用BitmapData类的threshold( )方法
讨论
threshold( )方法可能是BitmapData 方法中最复杂的一个了,但是它的功能十分强大,该方法使用两个BitmapData对象:
destBitmap, 要修改的位图
sourceBitmap, 原位图,需要此位图象素作为计算数据

该方法用6个比较操作符和指定的值与源位图的每个象素作比较,如果比较结果为false,则目标位图相应位置的象素被设置为指定的值,如果比较为true,要么不改变,也可拷贝原位图的象素值。
这是方法原型:
+展开
-ActionScript
destBitmap.threshold(sourceBitmap,
sourceRect,
destPoint,
operation,
threshold,
color,
mask,
copySource)

sourceRect是flash.geom.Rectangle类实例。它定义原位图要进行比较的区域,如果要比较整张位图,可传递sourceBitmap.rect 作为参数destPoint 参数指定目标位图那些象素受影响,从左上角开始把原始位图覆盖到目标位图上,如果从0,0开始则传递new Point( ) 作为参数即可

操作符参数可使用6个字符之一,它们是<, <=, >, >=, ==, 和!=。例如:如果指定为< 作为操作符,如果值小于阀值则通过,否则失败。

threshold参数即每个象素都与该阀值进行比较,可以指定为32位的数字。
mask 参数的作用是过滤颜色通道,可指定为十六进制数值,如果值为00则过滤掉相应通道,
FF即表示使用相应通道。例如0x00FF0000 表示过滤掉红色通道,0xFF000000 过滤掉alpha通道。

接下来的两个参数决定比较何时通过或失败
color 参数是设置到目标位图的象素颜色,copySource 参数决定比较失败将如何处理,如果比较结果为true,则把sourceBitmap的象素值拷贝到目标位图上,如果失败则不拷贝任何东西。

好了,现在我们看些例子:
+展开
-ActionScript
var srcBmp:BitmapData = new BitmapData(stage.stageWidth,
stage.stageHeight,
true, 0xffffffff);
srcBmp.perlinNoise(200, 100, 2, 1000, falsetrue, 1, true);
var destBmp:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xffffffff);
var image:Bitmap = new Bitmap(destBmp);
addChild(image);
destBmp.threshold(srcBmp, // sourceBitmap
srcBmp.rect, // sourceRectangle
new Point( ), // destPoint
"<"// operator
0x00880000, // threshold
0x00000000, // color
0x00ff0000, // mask
true); // copySource

检测给定象素的红色通道(由mask定义)是否小于0x00880000。如果是,那么该象素值设为透明,如果不是,则拷贝像素。

运行上面的代码后,由布林噪波产生的暗的区域都变成了透明。

如果把操作符改为" >"则会得到相反的效果,即亮的区域都变剪切掉了。

把阀值设高或低,如0x00330000 或0x00AA0000,则剪切更多或更少的像素

试着设置不同的颜色看看有什么效果,再试试把copySource 设置为false 看到没有拷贝像素,而是留在原始位图里。

和其他BitmapData方法一样,如果结合其他滤镜使用会得到更好的效果:
+展开
-ActionScript
destBmp.applyFilter(destBmp, destBmp.rect,
new Point( ), new DropShadowFilter( ));

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


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