一开始觉得AS3的滤镜很难使用,尤其是那些矩阵,让人望而生畏。最近写一个聊天模块,要用到离线状态下的灰色头像,于是认真研究了ColorMatrixFilter,发现其实也没有那么难。所谓的矩阵其实就是一个再普通不过的Array,只要弄懂这个Array各个元素的关系就很容易使用滤镜。
      先发代码,下面再详细介绍。这个程序实现加载一张彩色图像,通过滤镜变成黑白图像之后输出。

package {  
    import flash.display.Bitmap;  
    import flash.display.Loader;  
    import flash.display.Sprite;  
    import flash.events.Event;  
    import flash.filters.ColorMatrixFilter;  
    import flash.net.URLRequest;  
  
    public class ColorFilterSample extends Sprite  
    {  
        private var loader:Loader;  
        public function ColorFilterSample()  
        {  
            loader=new Loader();  
            loader.contentLoaderInfo.addEventListener  
                                             (Event.COMPLETE, onComplete);  
            loader.load(new URLRequest("hehua.jpg"));  
        }  
        private function onComplete(e:Event):void{  
            //加载一张彩色图片   
            var image:Bitmap=new Bitmap();  
            image=Bitmap(loader.content);  
            //定义滤镜matrix,一个包含20个项的数组  
            var matrix:Array=[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];  
                //初始化一个ColorMatrixFilter对象(matrix作为参数)  
            var myfilter:ColorMatrixFilter=new ColorMatrixFilter(matrix);  
            //将滤镜应用于图片   
            image.filters=[myfilter];  
            addChild(image);  
        }  
    }  
}  

  

首先定义一个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。

AS3灰色图像的更多相关文章

  1. 基于canvas图像处理的图片 灰色图像

    图片展示网页往往色彩繁杂,当一个网页上有多张图片的时候用户的注意力就很不容易集中,而且会造成网站整个色调风格的不可把控. 能不能把所有的预览图变成灰度图片,等用户激活某张图片的时候再上色呢? 以前,唯 ...

  2. [ActionScript 3.0] AS3实现图像径向转旋效果

    原图    效果     import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Blen ...

  3. 利用神经网络进行网络流量识别——特征提取的方法是(1)直接原始报文提取前24字节,24个报文组成596像素图像CNN识别;或者直接去掉header后payload的前1024字节(2)传输报文的大小分布特征;也有加入时序结合LSTM后的CNN综合模型

    国外的文献汇总: <Network Traffic Classification via Neural Networks>使用的是全连接网络,传统机器学习特征工程的技术.top10特征如下 ...

  4. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  5. PIL:处理图像的好模块

    介绍 PIL是一个专门用来处理图像的模块,可以对图象进行各种各样的变换 打开一张图片 from PIL import Image # 调用Image下的open方法,即可打开一张图片 # 得到的im便 ...

  6. Python——图像手绘效果

    1.图像的RGB色彩模式 PIL PIL, Python Image Library PIL库是一个具有强大图像处理能力的第三方库 在命令行下的安装方法: pip install pillow fro ...

  7. PHP 动态生成验证码

    ……机器人会在网站中搜寻允许他们插入广告的输入表单,在虚拟世界没有什么能阻挡它们胡作非为.这些机器人效率极高,完全不关心所攻击的表单的本来用途.它们唯一的目标就是用它们的垃圾广告覆盖你的内容,残忍地为 ...

  8. opencv6.4-imgproc图像处理模块之直方图与模板

    接opencv6.3-imgproc图像处理模块之边缘检测 九.直方图的相关操作 直方图是图像中像素强度分布的图形表达方式:它统计了每一个强度值所具有的像素个数 上图是一个灰色图像,通过对图像的每个不 ...

  9. [OpenCV] Image Processing - Grayscale Transform

    "每个像素的输出值只取决于其输入值" 重难点:Histogram equalization 参考:笑得很甜 http://blog.csdn.net/xiaowei_cqu/art ...

随机推荐

  1. ThinkPad T410i 2516A21 升級手札(換SSD固態硬碟、I7 CPU、開機20秒)

    最近筆記本越來越慢,開機得20分鐘,而且CPU動不動就飆到80度,趁著開學網上活動,準備給老伙計來一次重大升級.查一下主板芯片,最高支持8G內存,已經滿了,光驅位加了一個1T機械硬盤,那麼能升級的就只 ...

  2. Android中如何引入已经存在的标题栏

    在写程序中很多时候很多页面的标题布局大致都是一样的,这时候不需要挨着都写一遍,只需要写一个xml文件,在所需要的时候进行引用就可以了 只需要这一行代码: <include layout=&quo ...

  3. React中父子组件传值

    一.首先我们先来看父组件向子组件传值 1.1 我们要明白父组件 --> 子组件 是通过props这个属性来传值的 我们来看父组件的代码 import React from 'react'; im ...

  4. XMind配置防火墙

    1.打开控制面板,找到防火墙 2. 启用Windows防火墙 3.高级设置,新建入站规则 配置部分一律“下一步”. XMind配置防火墙完成.如果还不行,相同方式设置出站规则.

  5. Linux 上配置 SQL Server Always On Availability Group

    SQL Server Always On Availability Group 配置步骤:配置三台 Linux 集群节点创建 Availability Group配置 Cluster Resource ...

  6. SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  7. pxe问题

    可能镜像路径问题 https://blog.csdn.net/geek_tank/article/details/69479196 一.vmlinuz vmlinuz是可引导的.压缩的内核.“vm”代 ...

  8. 【大数据作业九】安装关系型数据库MySQL 安装大数据处理框架Hadoop

    作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3161 4.简述Hadoop平台的起源.发展历史与应用现状. 列举发展过程中 ...

  9. 使用CAS实现单点登录功能

    目录 单点登录 简介 CAS服务器部署 上传tomcat服务器压缩到文件夹/usr/local/cas目录下,解压,修改tomcat文件夹名为tomcat 修改tomcat配置文件的端口号 关闭tom ...

  10. jmeter BeanShell断言(四)

    Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...