zoukankan      html  css  js  c++  java
  • filter的运用

    colorTransform:简单的颜色变化。其中包含整体调整显示对象颜色的值。

    可使用 ColorTransform 类调整显示对象的颜色值。可以将颜色调整或颜色转换应用于所有四种通道:红色、绿色、蓝色和 Alpha 透明度。

    当 ColorTransform 对象应用于显示对象时,将按如下方法为每个颜色通道计算新值:

    • 新红色值 = (旧红色值 * redMultiplier) + redOffset
    • 新绿色值 = (旧绿色值 * greenMultiplier) + greenOffset
    • 新蓝色值 = (旧蓝色值 * blueMultiplier) + blueOffset
    • 新 Alpha 值 = (旧 Alpha 值 * alphaMultiplier) + alphaOffset

    如果计算后任何一个颜色通道值大于 255,则该值将被设置为 255。如果该值小于 0,它将被设置为 0。

    可以通过下列方式使用 ColorTransform 对象:

    • 在 BitmapData 类的 colorTransform() 方法的 colorTransform 参数中
    • 作为 Transform 对象(此对象可以用作显示对象的 transform 属性)的 colorTransform 属性

    必须使用 new ColorTransform() 构造函数创建 ColorTransform 对象后,才能调用 ColorTransform 对象的方法。

    颜色转换不会应用于影片剪辑(如加载的 SWF 对象)的背景色,它们仅应用于附加到影片剪辑的图形和元件。

     

    flash.filters包中的滤镜,常用的有这几个:

    BlurFilter:可使用 BlurFilter 类将模糊视觉效果应用于显示对象。

    可使用 BlurFilter 类将模糊视觉效果应用于显示对象。模糊效果可以柔化图像的细节。您可以生成一些模糊效果,范围从创建一个柔化的、未聚焦的外观到高斯模糊(就像通过半透明玻璃查看图像一样的朦胧的外观)。当此滤镜的 quality 属性设置为低时,结果为柔化的、未聚焦的外观。当 quality 属性设置为高时,该属性接近高斯模糊滤镜。您可以将滤镜应用于任何显示对象(即,从 DisplayObject 类继承的对象),例如 MovieClip、SimpleButton、TextField 和 Video 对象,以及 BitmapData 对象。

    要创建新的滤镜,请使用构造函数 new BlurFilter()。滤镜的具体使用取决于要应用滤镜的对象:

    • 要对影片剪辑、文本字段、按钮和视频应用滤镜,请使用 filters 属性(继承自 DisplayObject)。设置对象的 filters 属性不会修改相应的对象,而清除 filters 属性可以删除相应的滤镜。
    • 要对 BitmapData 对象应用滤镜,请使用 BitmapData.applyFilter() 方法。对 BitmapData 对象调用 applyFilter() 会取得源 BitmapData 对象和滤镜对象,并最终生成一个过滤图像。

    如果对显示对象应用滤镜,显示对象的 cacheAsBitmap 属性将设置为 true。如果删除所有滤镜,将恢复 cacheAsBitmap 的原始值。

    此滤镜支持舞台缩放。但是,它不支持常规缩放、旋转和倾斜。如果对象本身进行了缩放(scaleXscaleY 未设置为 100%),滤镜效果将不进行缩放。只有用户在舞台上进行放大时它才会缩放。

     

    GlowFilter:使用 GlowFilter 类可以对显示对象应用发光效果。

    ColorMatrixFilter:使用 ColorMatrixFilter 类可以将 4 x 5 矩阵转换应用于输入图像上的每个像素的 RGBA 颜色和 Alpha 值,以生成具有一组新的 RGBA 颜色和 Alpha 值的结果。

    使用 ColorMatrixFilter 类可以将 4 x 5 矩阵转换应用于输入图像上的每个像素的 RGBA 颜色和 Alpha 值,以生成具有一组新的 RGBA 颜色和 Alpha 值的结果。该类允许饱和度更改、色相旋转、亮度为 Alpha 以及各种其他效果。您可以将滤镜应用于任何显示对象(即,从 DisplayObject 类继承的对象),例如 MovieClip、SimpleButton、TextField 和 Video 对象,以及 BitmapData 对象。

    参考如下文章:

    一开始觉得AS3的滤镜很难使用,尤其是那些矩阵,让人望而生畏。最近写一个聊天模块,要用到离线状态下的灰色头像,于是认真研究了ColorMatrixFilter,发现其实也没有那么难。所谓的矩阵其实就是一个再普通不过的Array,只要弄懂这个Array各个元素的关系就很容易使用滤镜。

        先发代码,下面再详细介绍。这个程序实现加载一张彩色图像,通过滤镜变成黑白图像之后输出。

    [java] view plaincopy

    1. package {  
    2. import flash.display.Bitmap;  
    3. import flash.display.Loader;  
    4. import flash.display.Sprite;  
    5. import flash.events.Event;  
    6. import flash.filters.ColorMatrixFilter;  
    7. import flash.net.URLRequest;  
    8. public class ColorFilterSample extends Sprite  
    9.     {  
    10. private var loader:Loader;  
    11. public function ColorFilterSample()  
    12.         {  
    13.             loader=new Loader();  
    14.             loader.contentLoaderInfo.addEventListener  
    15.                                              (Event.COMPLETE, onComplete);  
    16.             loader.load(new URLRequest("hehua.jpg"));  
    17.         }  
    18. private function onComplete(e:Event):void{  
    19. //加载一张彩色图片
    20.             var image:Bitmap=new Bitmap();  
    21.             image=Bitmap(loader.content);  
    22. //定义滤镜matrix,一个包含20个项的数组
    23.             var matrix:Array=[0.3086, 0.6094, 0.0820, 0, 0,  
    24. 0.3086, 0.6094, 0.0820, 0, 0,  
    25. 0.3086, 0.6094, 0.0820, 0, 0,  
    26. 0,      0,      0,      1, 0];  
    27. //初始化一个ColorMatrixFilter对象(matrix作为参数)
    28.             var myfilter:ColorMatrixFilter=new ColorMatrixFilter(matrix);  
    29. //将滤镜应用于图片
    30.             image.filters=[myfilter];  
    31.             addChild(image);  
    32.         }  
    33.     }  

        首先定义一个matrix数组:一个包含20个浮点数的数组。AS3.0帮助文档中的计算公式是这样的:

    redResult     = (a[0]  * srcR) + (a[1]  * srcG) + (a[2]  * srcB) + (a[3]  * srcA) + a[4]
    greenResult = (a[5]  * srcR) + (a[6]  * srcG) + (a[7]  * srcB) + (a[8]  * srcA) + a[9]
    blueResult    = (a[10] * srcR) + (a[11] * srcG) + (a[12] * srcB) + (a[13] * srcA) + a[14]
    alphaResult  = (a[15] * srcR) + (a[16] * srcG) + (a[17] * srcB) + (a[18] * srcA) + a[19]

        上面的公式看起来有点复杂,没关系,再看下面的图示就清晰多了:

                           srcR    srcG     srcB      srcA     offset

    redResult       a[0]      a[1]     a[2]      a[3]      a[4] 

    greenResult   a[5]      a[6]     a[7]      a[8]      a[9]

    blueResult     a[10]    a[11]   a[12]    a[13]    a[14]

    alphaResult   a[15]    a[16]   a[17]    a[18]    a[19]

        srcR,srcG,srcB,srcA表示原始图像每个像素的RGBA值(关于像素颜色的RGBA值请查阅手册,这里不再展开),redResult,greenResutl,blueResult,alphaResult表示目标图像的RGBA值。上面公式的意思是说:redResult的值是a[0]、a[1]、a[2]、a[3]分别与 srcR,srcG,srcB,srcA相乘,再加上a[4]的总和(a[4]是偏移量)。greenResutl,blueResult,alphaResult以此类推。这样说应该很容易理解了吧?

        好吧,这个公式无非就是说原始图像的像素值,通过和这个数组交叉相乘,得到目标图像的像素值。

        很明显,我们给这个数组定义不同的值,则会得到不同的结果,目标图像的效果也不一样。这里要得到灰度图像应该使用这个数组:

        [0.3086, 0.6094, 0.0820, 0, 0,
         0.3086, 0.6094, 0.0820, 0, 0,
         0.3086, 0.6094, 0.0820, 0, 0,
         0,          0,          0,          1, 0];

        这个数组凭什么得来的呢?应该是某些大师实验得到的吧,百度可以搜索到这方面的专业论述,我这里就说一下大概意思。话说取得原始图像的RGB值,计算得到它们的平均值之后再赋给新的RGB值,这样对每个像素处理之后就得到黑白图像了,或者可以理解成RGB值按照0.33 : 0.33 : 0.33的权值重新分配;后来有些大师研究得到结论:如果RGB值按照0.3086 : 0.6094 : 0.0820的比例分配,得到的灰度图像看起来最顺眼,于是就有了上面的数组!顺便再提一下,这里的alpha值没有改变(那个数字1,你懂的),还有偏移量都为0。

         好了,明白了这个数组之后,将其作为参数传进ColorMatrixFilter的构造函数,生成一个滤镜实例myfilter,再将myfilter添加到图像即可。或许有些童鞋还要问为什么用image.filters=[myfilter]这条语句来添加滤镜?好的,我并不打算好人做到底,童鞋请回家看AS帮助文档吧^_*

  • 相关阅读:
    [NOIP2002 提高组] 均分纸牌
    洛谷 P1303 A*B Problem
    OpenJudge 1.6.5 年龄与疾病
    hdu 3340 线段树思路活用
    poj 2464 线段树统计区间..两棵树
    hdu 4419 矩形面积覆盖颜色
    经典动态规划 dp Rqnoj 57
    最基础二维线段树 hdu 1823 (简单)
    hdu 3564 线段树+dp
    spoj 1557 线段树 区间最大连续和 (不重复数)
  • 原文地址:https://www.cnblogs.com/axyz/p/3365165.html
Copyright © 2011-2022 走看看