早期设备由于CPU性能、内存限制,对程序如何表示像素往往以如何“省”为目标,像采用尽量少的位表示一像素,采用调色板来表示像素,但现在,即使是相对较弱的手机,进行一般图像处理的话CPU、内存已不再是瓶井,转而是要求如何才能让显示的图像更逼真。要做到逼真,前提是图像像素格式中必须存在Alpha分量,可以这么说,在往后的图像处理中你可以不懂调色板,但你不能不知道什么是Alpha混叠。

Alpha混叠是把两图面混叠在一块生成一新图面,这看似是两个输入一个输出,实际程序实现中是把一图面混叠去另一图面,而生成结果“就地”写在另一图面。在这过程中把去混叠的图面叫源图面(Source、src),混叠到的、生成的图面称为目标图面(Destination、dst)。

Alpha混叠算法有多种,以下是一种较常见的混叠算法(SDL_COPY_BLEND),此种算法一个特点是和目标图面的透明度无关)。

res = (s * alpha + d * (255-alpha)) / 255

alpha:叠加标志中没有SDL_COPY_MODULATE_ALPHA时,alpha就是源图面中该像素透明度srcA;否则“alpha = (srcA*mudulateA) / 255”,mulateA是叠前预设的透明度调整值。但不论是否存在SDL_COPY_MODULATE_ALPHA,alpha都和目标图面的透明度无关。
s、d:是源图面、目标图面中某一分量,res是混叠后的值。分量包括R、G、B。
R、G、B、A取值范围是0到255。

为减少乘法次数,让转换以上公式。

res = (s * alpha + d * (255-alpha)) / 255
     = (s * alpha + 255 * d – d * alpha) / 255
     = (s * alpha – d * alpha) / 255 + d
     = (s – d) * alpha / 255 + d

SDL中的ALPHA_BLEND宏实现了以上公式

#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB)        \
do {                                                \
        dR = ((((int)(sR-dR)*(int)A)/255)+dR);        \
        dG = ((((int)(sG-dG)*(int)A)/255)+dG);        \
        dB = ((((int)(sB-dB)*(int)A)/255)+dB);        \
} while(0)

和SDL_COPY_BLEND对应的还有两个值:SDL_COPY_ADD、SDL_COPY_MOD。它们是把两图面合成一图面的三种方式,不同的是SDL_COPY_BLEND采用Alpha混叠(要求源图面必须存在Alpha分量),后面两个不使用Alpha。以下代码可较明显看到它们三者区别。

转自:http://www.freeors.com/bbs/forum.php?mod=viewthread&tid=21210

posted on 2013-08-06 16:31  裴银祥的博客园  阅读(1503)  评论(0编辑  收藏  举报