在java中将ARGB转换为RGB

时间:2015-07-14 12:22:08

标签: java android colors

我尝试了一些算法来编写一种方法来从颜色中删除alpha值并给出相同的rgb值,但似乎我的测试总是失败。我相信它被称为alpha混合?我不确定。这是我用于转换的算法。

View

这样的测试

public static int removeAlpha(int foreground, int background) {
        int redForeground = Color.red(foreground);
        int redBackground = Color.red(background);
        int greenForeground = Color.green(foreground);
        int greenBackground = Color.green(background);
        int blueForeground = Color.blue(foreground);
        int blueBackground = Color.blue(background);
        int alphaForeground = Color.alpha(foreground);
        int redNew = (redForeground * alphaForeground) + (redBackground * (1 - alphaForeground));
        int greenNew = (greenForeground * alphaForeground) + (greenBackground * (1 - alphaForeground));
        int blueNew = (blueForeground * alphaForeground) + (blueBackground * (1 - alphaForeground));
        return Color.rgb(redNew, greenNew, blueNew);
    }

当我在photoshop中绘制红色并将不透明度设置为50%时,它给出了255,127,127 rgb,这与50%不透明的纯红色相同。我认为算法是错误的。任何帮助将不胜感激。

编辑:这是模拟颜色:

@Test
    public void removeAlpha() {
        int red = Color.RED;
        Assert.assertEquals(0xFFFF7F7F, Heatmap.removeAlpha(red, 0xFFFFFFFF));
    }

junit.framework.AssertionFailedError: 
Expected :-32897
Actual   :-258

3 个答案:

答案 0 :(得分:2)

您的公式将[0, 255]视为100%,但您的颜色函数返回/期望255 = 100%范围内的值,这意味着newColor = (colorA * opacityA + colorB * (255 - opacityA)) / 255

您必须使用以下公式:

foreground = 256 background = 0 foreground-alpha = 25%

示例:

[0,255]

foreground * 25% + background * 75%范围内,25%等于63 此示例的结果应为63,因为63100% - 25% = 256 - 63 = 193

因此,为了获得75%,您需要100% red

第二个问题:

您的测试用例是错误的。您正在使用100% white + 0xFFFF7F7F,这应该会导致100%的红色,而不是EmailAddress

正如@ frarugi87在他的回答中所说,你首先必须将红色的alpha通道设置为50%。

答案 1 :(得分:2)

注意:我并不是真的喜欢java,所以我错了。我只是使用常见的编程概念,因此可能需要进行一些调整。

我认为你正在搞乱数据类型...你得到你的颜色的整数表示,即0-255,并将它乘以它就像是0-1表示。试试这个:

double alphaForeground = ((double)Color.alpha(foreground)) / 255.0;
int redNew = ((int)round((redForeground * alphaForeground) + (redBackground * (1 - alphaForeground))));
int greenNew = ((int)round((greenForeground * alphaForeground) + (greenBackground * (1 - alphaForeground))));
int blueNew = ((int)round((blueForeground * alphaForeground) + (blueBackground * (1 - alphaForeground))));

可能存在舍入问题,但......这应该有效。

另一个评论:Color.RED有一个255 alpha通道。这意味着removeAlpha(red, 0xFFFFFFFF)本身返回红色,而不是0xFFFF7F7F。为了获得这个价值,你应该写

int red = Color.RED;
red.alpha = 0x80;

(或一些接近的值)

答案 2 :(得分:0)

试试这个:

int color = Color.argb(255, 118, 118, 188);