ColorMatrix(色彩矩阵),是GDI+里用来调整图片色彩的矩阵。
什么是矩阵,说白了就是C#里的二维数组。
那么这个矩阵调整色彩的原理是什么,他是怎么来调整色彩的呢?这个要从线性代数里的矩阵相乘说起。
以下段落学过线性代数的读者可以跳过,这里我用自己的理解来描述下矩阵相乘的算法和结果。

在线性代数里,两个矩阵相乘,是这样计算的:
A矩阵乘以B矩阵,那么新生成一个矩阵C,C的第N行M列的元素等于A的N行和B的M列逐个元素相乘的和。新生成的矩阵行数等于A的行数,列数等于B的列数。
另外A和B需要满足,A的列数等于B的行数。这就是为了保证,A的每一行上每个元素都能B的每一列上每个元素都能相乘。
即A[m,n] X B[n,p] = C[m,p]
直观的描述下,有矩阵A[2,3]
{
1,2,3
4,5,6
}
和矩阵B[3,2]
{
7 , 8
9 , 10
11, 12

}
那么相乘后生成新矩阵C[2,2]
{
1*7+2*9+3*11,1*8+2*10+3*12
4*7+5*9+6*11,4*8+5*10+6*12
}
好了,矩阵的概念描述到此。以下就说说GDI+里的色彩矩阵。

在计算机里,一副图片可以看成是点的集合。虽然图片有宽和高的概念,看起来是二维的,其实在处理时我们完全可以把宽、高看成是图片的属性,和点无关,把图片的所有点看成是一维数组。
而点本身是红绿蓝的集合,现在计算图形中再加入一个Alpha值(表示透明度),那么就是4个属性的集合,这样一副图片就成了二维的数组了,也就是标准的矩阵了。
那么一副4个点的图片描述成矩阵就是P[4,4]
{
R1,G1,B1,A1
R2,G2,B2,A2
R3,G3,B3,A3
R4,G4,B4,A4
}
当我们把这个矩阵和另一个4X4的矩阵M
{
rr,gr,br,ar
rg,gg,bg,ag
rb,gb,bb,ab
ra,ga,ba,aa
}
相乘时,就会生成一个新的矩阵,新矩阵和原矩阵元素数量相同(不信可以用[5,4]、[6,4]矩阵和它相乘看看),并且新矩阵的每个元素,都发生了有趣的变化。我们来看看结果,新矩阵NP:
{
R1*rr+G1*rg+B1*rb+A1*ra,R1*gr+G1*gg+B1*gb+A1*ga,R1*br+G1*rg+B1*bb+A1*ba,R1*ar+G1*ag+B1*ab+A1*aa
......
......
......
}
可以看到,新矩阵第一行(也就是新的图片的第一个点)的R,G,B,A都等于原图片的第一个点的所有RGBA新的混合值了。也就说,通过矩阵相乘,可以在图片原来的基础上改变新图片RGBA各个分量的值。
同时也能看出来我为什么把M矩阵的各个元素这么命名:rr表示新生成的R分量中原R分量的比例,gr表示新生成G分量中原R分量的比例,br表示新生成的B分量中原R分量的比例。依此类推。

另外再说一点,那就是GDI+中ColorMatrix是个5X5的矩阵,而不是4X4的矩阵,为什么会多出1行和1列呢。
我们来看NP,他的第一个元素是R1*rr+G1*rg+B1*rb+A1*ra,看出什么了吗?那就是只能做3个元素的加法,而不能做负值运算,即如果我想做R1的反色运算(用255减去原来的值)就做不到了,所以GDI+在原来的基础上扩展了一维,虚拟的一维W,这样一个点就变成了R,G,B,A,W。这个多出来的W在平时是不存在的,只有在色彩矩阵运算时才起辅助作用,默认就是255。
我们看加了一维W后NP第一个元素的结果
R1*rr+G1*rg+B1*rb+A1*ra+W1*rw
这样,将rw设为1,rr设为-1,其他为0,那么结果就是255-R1,怎么样,反色运算能完成了。

ColorMatrix 5*5颜色矩阵相关推荐

  1. ColorMatrix颜色矩阵让图片千变万化

    在自定义控件中最熟悉的就是Paint,Canvas,path,Matrix等,要想炫酷效果这几个类必不可少.Paint.setColorFilter(ColorFilter filter):设置颜色过 ...

  2. 颜色矩阵ColorMatrix的使用

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 颜色矩阵是一个4x 5的矩阵,如下图: 让它和颜色分量RGBA相乘去改变RGBA的值 至于矩阵的运算就不多说了 ...

  3. GdiPlus[59]: 图像(十一) IGPImageAttributes 之颜色矩阵(TGPColorMatrix)变换

    IGPMatrix 矩阵 是个接口, 要通过 TGPMatrix 实例化后使用, 其内置了很多方法和属性. TGPColorMatrix 只是一个结构体, 除了矩阵数据(5*5)外, 它只有一个方法: ...

  4. 【Android 应用开发】Paint 滤镜原理 之 颜色矩阵 ( 颜色模式 | 颜色通道 | 颜色矩阵 | 矩阵运算 | 矩阵乘法 | 矩阵加法 | 颜色矩阵深入解析 )

    文章目录 颜色模式 颜色通道 Android 中的颜色矩阵 矩阵乘法运算 滤镜中的矩阵乘法运算 矩阵加法运算 滤镜中的矩阵乘法运算 滤镜运算原理 ( 总结 ) 实际滤镜理论示例 颜色模式 颜色模式 : ...

  5. Egret中颜色矩阵和滤镜的使用与介绍

    一:颜色矩阵 颜色矩阵说明 颜色矩阵数据说明: 实际的颜色值由下面的公式决定: redResult = (a[0] * srcR) + (a[1] * srcG) + (a[2] * srcB) + ...

  6. Android 使用ColorMatrix改变图片颜色

    ColorMatrix的颜色矩阵介绍 颜色矩阵M是一个5*4的矩阵,在Android中,颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方 ...

  7. [AS3][Matrix][利用颜色矩阵进行颜色变换]

    import  flash.filter.ColorMatrixFilter; 颜色矩阵:var arr:Array ; R   G   B   A  Off R   1    0   0   0   ...

  8. matlab_颜色矩阵三原色

    matlab绘图时,通过plottools调出的面板可以可视化选择曲线散点等图像的颜色,但这种方法只是人工肉眼识别,其实我们可以用三原色矩阵来控制图像颜色: 其中,纯红是[1 0 0],纯绿是[0 1 ...

  9. Android-Q颜色矩阵

    0 前言 颜色反转[2].夜间模式[3].显示白平衡[4].色彩校正[5].模拟颜色空间[6].强调色[7].护眼模式[8].色温调节[9]等显示效果都是通过颜色矩阵实现的,因此本文重点对其进行分析. ...

最新文章

  1. “每日 4 +1 问”理念之体重记录
  2. 只腐蚀毛刺 腐蚀算法_避坑干货!8大卫浴五金选购指南,只买对的不买贵的
  3. PHP判断远程图片或文件是否存在
  4. 【转】 C++中的new VS C语言中的malloc
  5. 9月24日直播丨数据库大咖讲坛(第7期):数据库内核技术与行业应用
  6. java 蓝桥杯算法训练 奇变的字符串(题解)
  7. SPC软件:全程监控食品质量
  8. 大一新生计算机专业对未来的展望,大学生未来展望简短
  9. 塔尔萨大学计算机科学专业,塔尔萨大学有哪些专业_专业排名(USNEWS美国大学排名)...
  10. 【遗传算法GA】--计算函数最值(Python)
  11. 005--Keil使用--出现integer conversion resulted in truncation
  12. python中模拟浏览器抓取网页(-)
  13. 大一作业HTML网页作业:中华传统文化题材网页设计(纯html+css实现)
  14. C++ 动态创建二维数组
  15. 分组统计 - 不同时间颗粒度下,按照秒、分、时、日、周、月、季度、年 GROUP BY 分组统计 - (MySQL)
  16. 个人电子邮箱注册申请哪个更好用?
  17. matlab 使用定时器画连续正弦波信号
  18. springboot2.0 多线程并发执行任务
  19. C++Python描述 LeetCode 1109. 航班预订统计
  20. java注解和反射——狂神说java学习笔记三

热门文章

  1. java centos 缩略图_Nginx国人开发缩略图模块(ngx_image_thumb)
  2. vue项目系统兼容IE浏览器问题以及解决方案
  3. 高中信息技术python及答案_高中信息技术《Python语言》模块试卷.doc
  4. 工作流process-designer图 未执行的用户示例出线高亮显示bug
  5. Elasticsearch的节点与分片
  6. 那些你很冒险的梦 我们陪你一起去疯
  7. Maven下载安装及使用
  8. 怎么翻译整篇Excel文档?Excel文档翻译一招搞定
  9. 如何减少项目中的冗余代码?
  10. EXCEL密码破解/破解工作表保护密码(详细图文教程)