我尝试了一些算法来编写一种方法来从颜色中删除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
答案 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,因为63
为100% - 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);