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再混合。

  • 相关阅读:
    【转载】设计模式_单例模式(学习)
    【转载】设计模式_抽象工厂模式(学习)
    【转载】设计模式_工厂方法(学习)
    【转载】设计模式_六大原则(学习)
    【转载】设计模式_简单工厂模式(学习)
    java有用的启动参数
    linux freetds操作mssql
    ansible 控制windows
    nginx 版本介绍
    tar 压缩去除目录
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4325852.html
Copyright © 2011-2022 走看看