`
emowuyi
  • 浏览: 1470840 次
文章分类
社区版块
存档分类
最新评论

C++实现Photoshop图层颜色混合模式(完整版)

 
阅读更多

我在《C++实现Photoshop图层颜色混合模式》和《C++实现Photoshop图层颜色混合模式(续)》2篇文章中实现了Photoshop颜色图层混合模式的基本功能,本文拟在此基础上进一步实现带Alpha通道的颜色图层混合模式,这样Photoshop的颜色图层混合模式就可以说被完整的实现了。

要实现带Alpha通道的32位颜色图层混合模式,比24位颜色图层混合模式复杂的多,后者只是前者的一个特例。因此本文代码作了全面修改,部分代码进行了优化,主要是将原代码在像素合成过程中的一些浮点运算全部改为整数运算,将某些整数除法改为移位运算等,这样可以使代码效率提高一些,但同时代码的可读性也有所下降。只是熊掌与鱼不可兼得,特别是图像像素级的处理,随便一个小小的改进会使得效率成倍提高(其实,本文像素处理代码中还存在的一些整数除法,也是可以全部优化掉的),另外,原处理代码要求2张图像尺寸一样大,现在可处理2张不同大小图像的颜色混合(最终合成大小为底层目标大小)。

下面是带Alpha通道的32位颜色图层混合模式的全部代码:

下面给出几张png图片测试效果图:

源图一(苹果) 源图二(雪花)

上面一排是雪花图为底层,苹果图为上层实现的颜色混合,从左到右,Alpha分别为100%、80%和50%。

下面一排是苹果图为底层,雪花图为上层实现的颜色混合,从左到右,Alpha分别为100%、80%和50%。

从左到右:雪花图100%Alpha红色染色,雪花图50%Alpha红色染色,苹果图100%Alpha蓝色染色。

另外,需要说明的是,在Photoshop的图层混合选项中,除了不透明度外,还有个填充数选项,二者的区别是:不透明度选项指的是图层本身而言,填充数选项是混合时本图层像素的填充比例。但实际上二者在本质上是一回事,也就是是说二者的乘积就是最终的填充不透明度。

由于本人水平有限,虽经改进,但错误在所难免,欢迎提出宝贵意见,邮箱地址:maozefa@hotmail.com

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics