• 【转】【C#】ColorMatrix


    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,怎么样,反色运算能完成了。

    颜色:

    [R,G,B,A,W]

    矩阵:

    [rr,gr,br,ar,wr]

    [rg,gg,bg,ag,wg]

    [rb,gb,bb,ab,wb]

    [ra,ga,ba,aa,wa]

    [rw,gw,bw,aw,ww]

    结果颜色:

    [R*rr+G*rg+B*rb+A*ra+W*rw, R*gr+G*gg+B*gb+A*ga+W*gw, R*br+G*rg+B*bb+A*ba+W*bw, R*ar+G*ag+B*ab+A*aa+W*aw, R*wr+G*wg+B*wb+A*wa+W*ww]

    如果是单位矩阵

    [1,0,0,0,0]

    [0,1,0,0,0]

    [0,0,1,0,0]

    [0,0,0,1,0]

    [0,0,0,0,1]

    那么颜色结果就是

    [R*1,G*1,B*1,A*1,W*1]

    原文:http://www.cnblogs.com/lersh/archive/2008/07/22/1248713.html

  • 相关阅读:
    优先队列实现哈弗曼最小权值
    最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
    背包问题------
    背包问题------ 分类: ACM 2015-08-03 20:57 1人阅读 评论(0) 收藏
    Cent Savings (DP) 分类: ACM dp 2015-08-03 14:32 4人阅读 评论(0) 收藏
    Cent Savings (DP)
    Judging Troubles (multiset查找) 分类: ACM STL 2015-08-03 14:27 3人阅读 评论(0) 收藏
    Judging Troubles (multiset查找)
    Joke with permutation
    dubbo源码之二——dubbo入口
  • 原文地址:https://www.cnblogs.com/mqxs/p/5673439.html
Copyright © 2020-2023  润新知