【问题标题】:Alpha blending clarification阿尔法混合澄清
【发布时间】:2015-10-28 04:52:50
【问题描述】:

我正在实现 alpha 混合,我遇到的一个示例使用了这种格式。我很困惑为什么要除以256,为什么红色和蓝色通道中没有inv_alpha

int pixel,vga_pixel;
int alpha, blue, green, red, pixel;

int height = 1296;
int width = 968;
int x, y;

for (y = 0; y <= height; y++){
    for (x = 0; x <= width; x++){
        pixel = *(img.memloc + x + y);
            //0xff gets the first 8 bits, in this case red  
            red = pixel & 0xff; 

            //shift by 8 to get rid of red then AND  to get first 8, here green
            green = pixel >> 8 & 0xff; 

            blue = pixel >> 16 & 0xff;

            alpha = pixel >> 24 & 0xff;
            int inv_alpha = 0xff - alpha; // 1-alpha

            int vga_red = (red*(int)alpha);
            int vga_green = (green*(int)alpha + inv_alpha/256);
            int vga_blue = (blue*(int)alpha);
            int vga_alpha = 0xff;

            int vga_pixel = vga_alpha << 24 | vga_blue << 16 | vga_green << 8 | vga_red;            
    }
} 

谁能澄清这是否是一种有效的方法,为什么?

【问题讨论】:

  • 也许你应该问inv_alpha/256有什么区别,0到255(我假设)和256之间的数字之间的整数除法给出.... 0。我猜你可以简单地忽略并删除它。
  • 我的印象是实际公式是:vga_red=redalpha +inv_alphared。这是错的吗?
  • 公式为 red = source_red * alpha + destination_red * inv_alpha。该代码中没有进行混合,因为只有一组 RGB 值。

标签: c++ c alphablending


【解决方案1】:

看起来您已经混合了整数和浮点混合的公式。例如,如果redalpha 都是,vga_red 可能应该变为 255,因此它会更接近(red*alpha)/255,但您可能应该使用(red*alpha+127)/255 确保正确舍入。

inv_alpha256 分开总是会产生零,所以它可能是错误的,我猜你希望结果是alpha 如果alpha255255 如果@987654332 @ 是 0。所以它会变成(green*alpha+127)/255 + inv_alpha

【讨论】:

    【解决方案2】:

    Alpha 混合的公式是C = alpha_A * A + (1 - alpha_A * B)。但在这个公式中,我们使用的是浮点值,而 alpha 是一个介于 0 和 1 之间的值。

    由于我们使用的是整数值,因此 alpha(以及红色、绿色和蓝色)是介于 0 和 255 之间的值。所以 1 - alpha_A 的值被封装在 inv_alpha_A = 255 - alpha_A 中。

    由于每种颜色不能超过一个字节的最大值,所以我们要保证计算出来的数字不超过255。所以我们要除以255。结果是:

    C = (alpha_A * A + inv_aplha_A * B) / 255

    (我故意跳过了舍入问题)。

    【讨论】:

    • 那为什么只在绿色上?
    • 应该改成(1 - alpha_A) * B吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2012-04-26
    • 2015-05-02
    相关资源
    最近更新 更多