首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alpha混合澄清

Alpha混合澄清
EN

Stack Overflow用户
提问于 2015-10-27 15:56:57
回答 2查看 755关注 0票数 0

我正在实现一个alpha混合,我遇到的一个例子就使用了这种格式。我搞不懂为什么用256划分,为什么在红色和蓝色通道中没有inv_alpha

代码语言:javascript
复制
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;            
    }
} 

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-27 16:28:26

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

256除以inv_alpha总是会产生0,所以它可能是错误的,我猜你希望结果是green,如果alpha255,那么结果是255,如果alpha0。所以它会变成类似于(green*alpha+127)/255 + inv_alpha的东西。

票数 2
EN

Stack Overflow用户

发布于 2015-10-27 17:26:03

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33362525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档