从颜色中删除alpha但保留其纹理

时间:2011-10-12 13:48:15

标签: java android colors

我有一个颜色#6A8F6509

我想删除该颜色的Alpha部分,只留下RGB组件(即#RRGGBB)。

结果颜色必须与没有透明度的初始颜色相同。

如何在Android的Java上进行此操作?

更新:初始背景始终为白色(#FFF)

5 个答案:

答案 0 :(得分:24)

int newColor = oldColor | 0xFF000000;

答案 1 :(得分:12)

如果您想使用代码执行此操作,可以尝试使用以下代码:

    static int stripAlpha(int color){
    return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
}

答案 2 :(得分:4)

对于每种颜色: C'= C(a / 255)+ 255(1-(a / 255))

所以#6A8F6509:

R'= 143(106/255)+ 255(1-(106/255)=(约)208

G'= 101(106/255)+ 255(1-(106/255)=(约)191

B'= 9(106/255)+ 255(1-(106/255)=(约)153

所以你的答案应该是:#D0BF99,如果我的数学是正确的。这仅适用于全白色背景 - 对于非白色背景,第二个加数应具有背景的相应颜色值,而不是255.

- 编辑 -

再次查看公式,我不完全确定公式是应​​用于每种颜色还是整个颜色(快速视觉测试应该能够告诉你 - 我猜每种颜色)。我应该指出,这是直接来自Alpha Compositing wiki页面的公式:

http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending

答案 3 :(得分:1)

尝试

#FF8F6509

前两位数字表示任何颜色的alpha值。

答案 4 :(得分:1)

我承认不了解Android的Java,但你不能只将#6A8F6509的颜色更改为#FF8F6509吗?在大多数现代编程语言中,颜色通常编码为## AARRGGBB。

AA = Alpha的十六进制,范围从0(十六进制00),全透明,到255(十六进制FF),无透明度。

RR =颜色的红色部分的十六进制。与上面类似,0表示没有红色,255表示全红色。

GG =绿色的十六进制。

BB =蓝色的十六进制。

- 编辑 -

根据您的更新,您可以执行此操作以获取颜色:

对于红色,绿色和蓝色中的每一个: 获取透明颜色和背景颜色之间的差异,并将其乘以alpha值。除以255(十六进制FF,如果您愿意)。最后,将该数字添加到透明颜色的值中。

在你的情况下:

int transparentR = 0x8F;
int transparentG = 0x65;
int transparentB = 0x09;
int backgroundR = 0xFF;
int backgroundG = 0xFF;
int backgroundB = 0xFF;
int alpha = 0x6A;

int newR = transparentR + ( ( (backgroundR - transparentR) * alpha ) / 255 );
int newG = transparentR + ( ( (backgroundG - transparentG) * alpha ) / 255 );
int newB = transparentR + ( ( (backgroundB - transparentB) * alpha ) / 255 );

-Edit,再次 -

好的,我使用维基百科的Alpha Blending功能重写了基于LJ2答案的公式。并让一位同事用Paint.Net证实了这一点。这是背景颜色完全不透明的版本,它在C#中,抱歉:

 int transparentColor2(int intFgColor, int intBgColor, int intAlpha)
 {
double dAlpha = (Convert.ToDouble(intAlpha)/255.0);
double dFirst = Convert.ToDouble(intFgColor) * dAlpha;
double dSecond = Convert.ToDouble(intBgColor) * (1 - dAlpha);
return Convert.ToInt32(dFirst + dSecond);
 }

为每个R,G和B值执行此操作,您应该得到正确的答案。 Incase Android的Java有不同,double可以是Double / Single / Float,int可以是Int32 / Int16 / Int64 / Byte。遗憾的是,我不记得如何用Java在两者之间进行转换。