WEB开发网
开发学院软件开发VC GDI+ ColorMatrix的完全揭秘与代码实现(上) 阅读

GDI+ ColorMatrix的完全揭秘与代码实现(上)

 2008-09-09 19:25:24 来源:WEB开发网   
核心提示: 关于ColorMatrix功能的实现原理就这些,最后说说前面所提到的负值运算问题:ColorMatrix的负值运算无论是从原理上还是纯技术实现上都很有些麻烦:a)、在前面缩放举例中,GDI+ ColorMatrix的完全揭秘与代码实现(上)(5),也就是只有主对角线有值的情况下,b的负值运

关于ColorMatrix功能的实现原理就这些,最后说说前面所提到的负值运算问题:ColorMatrix的负值运算无论是从原理上还是纯技术实现上都很有些麻烦:

a)、在前面缩放举例中,也就是只有主对角线有值的情况下,b的负值运算为 b = B * m33 = 64 * -1 = 192,这是正确的,但是,如果加上一个剪切量或者平移量,这个值就发生了一些变化。比如在缩放基础上加上0.1的平移量,这似乎是很简单的问题,直接用0.1 * 255加上去不就得了!可是,这个看是简单的问题,却有2个方案:是在缩放后的192基础上加平移量0.1 * 255等于218?还是应该做连续运算: b = B * m33 = 64 * -1 + 255 * 0.1= -38(饱和处理后为0)呢?如果是前者,运算法则上似乎说不过去;如果是后者,感官上难以接受,本来b=192使颜色值“蓝蓝”的,本想让它再“蓝”一点,而加个平移(亮度)量,可即使这个平移量相当小,例如只平移0.001,却让b值变成了0,不仅没有变的更“蓝”,反而使颜色失去了蓝色分量!可ColorMatrix偏偏用了使你感官难以接受的方案。其实也难怪设计者,只要顺其自然去实现代码,最后自然就成了这个结果。能够造成这个结果的,不仅仅是平移量,只要矩阵中主对角线以外的任何一个值不为0,包括不起作用的第5列,都会使主对角线中,具有负值所对应的RGBA分量发生这种变化。具体请看本文中篇的代码实现。

b)、前面也提到了有朋友用-1矩阵对图像求反不合要求的问题。通过上面的缩放公式计算一下,不难发现,用-1矩阵所得到的图像取反图只是近似的!为什么这么说呢?所谓取反,就是可逆,如果用255减去R(GB)取反后,再用255去减就可还原;用255异和R(GB),不用说也是可逆的,而-1 * R(GB)确实不可逆的,如1 * -1饱和取整后为255,2 * -1为254 ......,只有0 * -1饱和取整还是0。按照这个算法的结果,再用-1去乘,得到的却是255 * -1 = 1、254 * -1 = 2等等,根本不能还原!虽然不可逆,但从人的感官上,这点误差还是能接受的,但就是那个“0”,却成了感官上也不能接受的理由:本来“0”的正确取反值应该为255,但这里无论是取反,还是还原,“0”依然是“0”,所以破坏了取反图的协调,例如原来纯红色的像素、取反后应该为青色,可是这里却变成了黑色,你能接受吗?所以只要图像像素RGB任何一个分量为0,那么这幅图的取反效果就会出问题!有人可能说,我们都是这么做的,除了极少数图片,大部分取反图看上去还是正常的,难道这些正常图里面就没有RGB分量为0的像素?其实,一幅图中间歇的分布几个RGB分量为0的像素,取反后,看上去是不那么明显的,所以我们认为这是成功的,只有那些“0”分量集中的部分,才严重破坏了图的协调。

关于ColorMatrix原理上的揭秘就到此,由于我的文化理论水平有限,只能从技术角度来揭秘ColorMatrix的实现原理,说得不好,请原谅!

通过上面对ColorMatrix详尽的技术解剖,我们推出了它的运算公式,有了这些,用程序代码实现ColorMatrix功能,应该很容易了,本文中篇将介绍ColorMatrix功能的具体实现,相信各位高手应该比我更在行。

如有不同看法和疑问,可写在文章评论中,本人将尽可能予以解答。欢迎指导和建议,来信邮箱:maozefa@hotmail.com

上一页  1 2 3 4 5 

Tags:GDI ColorMatrix 完全

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接