将两个Color整数与Java中的透明度组合在一起

Mat*_*ark 3 java colors

我正在开发一个项目,要求我手动计算我正在使用的每个像素颜色的颜色,并将两个颜色组合在一起.

底部像素颜色将始终具有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;

    }

}
Run Code Online (Sandbox Code Playgroud)

我对这个算法的问题是,一些像素的aRGB值为(???, 0, 0, 0),并且遵循此代码,底部像素颜色将占优势,而不是alpha变暗的值.

任何有关如何改进的解决方案将不胜感激.

Ted*_*opp 6

使用标准的alpha混合公式,您应该使用以下方法计算输出颜色:

cRed = (tRed * tAlpha + bRed * (255 - tAlpha)) / 255;
Run Code Online (Sandbox Code Playgroud)

同样适用于蓝色和绿色通道.这只是将每个rgb通道设置为相应的顶部和底部通道值的线性插值,根据其在tAlpha[0,255]范围内的位置.我不相信你需要担心夹紧; 每个组件将保持在[0,255]范围内.

当然,你可以利用快捷方式的特殊情况tAlpha == 0tAlpha == 255.