图片alpha blending的计算

转载时请注明出处和作者联系方式:http://blog.csdn.net/mimepp
作者联系方式:YU TAO <yut616 at sohu dot com>

一幅彩色图像的每个像素用 R G B 三个分量表示,若每个分量用 8 位,那么一个像素共用 3X8=24 位表示。
在用 32 位表示一个像素时,若 R G B 分别用 8 位表示,剩下的 8 位常称为 α 通道 (alpha channel) 位。 它用来表示该像素如何产生特技效果,即通常我们说的半透明。

alpha的取值一般为0到255。
为0时,表示是全透明的,即图片是看不见的。为255时,表示图片是显示原始图的。中间值即为半透明状态。
计算alpha blending时,通常的方法是将源像素的RGB值,分别与目标像素(如背景)的RGB按比例混合,最后得到一个混合后的RGB值。
方法:
=  ( R_src  *  alpha  +  R_dest  *  ( 256   -  alpha) ) / 256 ;
含义即为源与目标各占的百分比。
简化后:
=  ( (R_src  *  alpha  -  R_dest  *  alpha)   +  R_dest  *   256  ) / 256 ;
除256,也即右移8,即:
=  (R_src  -  R_dest)  *  alpha  >>   8   +  R_dest;

在microwindows中也有类似的代码:
fblin32alpha.c

while  ( -- >=   0 {
        
for (i = 0; i < w; ++i) {
            register unsigned 
long s;
            register unsigned 
long d;
            s 
= src8[MWI_BYTE_OFFSET_R];
            d 
= dst8[MWI_BYTE_OFFSET_R];
            dst8[MWI_BYTE_OFFSET_R] 
=
                (unsigned 
char) (((s - d) * alpha) >> 8+ d;
            s 
= src8[MWI_BYTE_OFFSET_G];
            d 
= dst8[MWI_BYTE_OFFSET_G];
            dst8[MWI_BYTE_OFFSET_G] 
=
                (unsigned 
char) (((s - d) * alpha) >> 8+ d;
            s 
= src8[MWI_BYTE_OFFSET_B];
            d 
= dst8[MWI_BYTE_OFFSET_B];
            dst8[MWI_BYTE_OFFSET_B] 
=
                (unsigned 
char) (((s - d) * alpha) >> 8+ d;
            s 
= src8[MWI_BYTE_OFFSET_ALPHA];
            d 
= dst8[MWI_BYTE_OFFSET_ALPHA];
            dst8[MWI_BYTE_OFFSET_ALPHA] 
=
                (unsigned 
char) (((s - d) * alpha) >> 8+ d;
            dst8 
+= 4;
            src8 
+= 4;
        }

        dst8 
+= dlinelen_minus_w4;
        src8 
+= slinelen_minus_w4;
    }

如果你使用的数据是YUV数据,那么根据YUV与RGB的转换公式:
=   0 .299R  +   0 .587G  +   0 .114B
U
=  (B - Y) * 0.565
V
=  (R - Y) * 0.713
也可以直接对YUV应用上面的公式计算alpha blending,不必转换成RGB再混合。

你可能感兴趣的:(byte,DST)