alpha blending算法--详细解读

*转载时请注明出处和作者联系方式:[http://blog.csdn.net/mimepp]

一幅彩色图像的每个像素用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 = ( R_src * alpha + R_dest * (256 - alpha) )/256;

含义即为源与目标各占的百分比。
简化后:

R = ( (R_src * alpha - R_dest * alpha)  + R_dest * 256 )/256;
除256,也即右移8,即:
R = (R_src - R_dest) * alpha >> 8 + R_dest;

在microwindows中也有类似的代码:

fblin32alpha.c

while (--h >= 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的转换公式:

Y = 0.299R + 0.587G + 0.114B
U= (B-Y)*0.565
V= (R-Y)*0.713

也可以直接对YUV应用上面的公式计算alpha blending,不必转换成RGB再混合。

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值