zoukankan      html  css  js  c++  java
  • 图片alpha blending的计算

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

    一幅彩色图像的每一个像素用RGB三个分量表示,若每一个分量用8位,那么一个像素共用3X8=24位表示。
    在用32位表示一个像素时,若RGB分别用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再混合。

  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4325852.html
Copyright © 2011-2022 走看看