我正在开展一个项目,要求我手动计算我正在使用的每种像素颜色的颜色,并将两者结合在一起。
底部像素颜色始终具有100%不透明度,但顶部不会,并且可以包含任何级别的不透明度。
我正在尝试创建一种算法来组合颜色,以便不透明度具有实际效果,以下是我目前所拥有的:
public static int combine(int bottom, int top) {
int tAlpha = Color.alpha(top);
if (tAlpha < 255 && tAlpha > 0) {
int tRed = Color.red(top);
int tGreen = Color.green(top);
int tBlue = Color.blue(top);
int bRed = Color.red(bottom);
int bGreen = Color.green(bottom);
int bBlue = Color.blue(bottom);
int cRed = (int) (bRed + (tRed * (Float.valueOf(tAlpha) / 255)));
int cGreen = (int) (bGreen + (tGreen * (Float.valueOf(tAlpha) / 255)));
int cBlue = (int) (bBlue + (tBlue * (Float.valueOf(tAlpha) / 255)));
cRed = (cRed <= 255) ? cRed : 255;
cGreen = (cGreen <= 255) ? cGreen : 255;
cBlue = (cBlue <= 255) ? cBlue : 255;
return Color.argb(255, cRed, cGreen, cBlue);
} else if (tAlpha == 0) {
return bottom;
} else if (tAlpha == 255) {
return top;
} else {
return 0;
}
}
我使用此算法的问题是,某些像素的aRGB值为(???, 0, 0, 0)
,并且遵循此代码,底部像素颜色将占优势,而不是alpha变暗的值。
非常感谢任何有关如何改进的解决方案。
答案 0 :(得分:6)
使用标准alpha blending formulas,您应该使用以下方法计算输出颜色:
cRed = (tRed * tAlpha + bRed * (255 - tAlpha)) / 255;
同样适用于蓝色和绿色通道。这只是根据tAlpha
在[0,255]范围内的位置,将每个rgb通道设置为相应的顶部和底部通道值的线性插值。我不相信你需要担心夹紧;每个组件将保持在[0,255]范围内。
当然,您可以针对tAlpha == 0
和tAlpha == 255
的特殊情况选择快捷方式。