阿尔法混合澄清
Alpha blending clarification
我正在实现一个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;
}
}
有人能澄清这是否是一种有效的方法吗?为什么?
看起来就像是混合了整数和浮点混合的公式。例如,如果red
和alpha
都是,则vga_red
可能会变为255,因此它会更接近(red*alpha)/255
,但您可能应该通过使用(red*alpha+127)/255
来确保正确的舍入。
用256
除以inv_alpha
总是会得到零,所以这可能是错误的,我猜如果alpha
是255
,你希望结果是green
,如果alpha
是0
,你希望得到255
。所以它会变成类似(green*alpha+127)/255 + inv_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
(我故意跳过舍入问题)。
相关文章:
- Visual Studio Code - C++ Debugger 無法啟動
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- CMakeLists.txt中的命名空间表示法
- D3D11-将混合权重和索引传递到顶点着色器
- 如何使用阿尔法努姆算法对C++中的文本行进行排序?
- 在不损失阿尔法值的情况下将 QColor 转换为 QString
- 布尔阿尔法大写
- 协议缓冲区(protobuf)v3.0.0-阿尔法-2中的可选字段和约束
- 阿尔法-贝塔"breaking"阿姆达尔定律?
- C++ 如何检查字母是否为阿尔法(不是拉丁字母)
- 如何判断万智牌::图像是否具有阿尔法通道
- 在 QImage 阿尔法通道中制作多边形孔
- 最小阿尔法贝塔的路径
- 迷你最大阿尔法贝塔修剪奥赛罗不工作
- 阿尔法混合澄清
- 阿尔法修剪过滤器故障
- 如何处理etc1阿尔法通道
- SDL - 动态阿尔法
- 阿尔法混合未产生所需的图像