Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从颜色中删除alpha,但保留其纹理_Java_Android_Colors - Fatal编程技术网

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

Java 从颜色中删除alpha,但保留其纹理,java,android,colors,Java,Android,Colors,我有一个颜色#6A8F6509 我希望删除该颜色的Alpha部分,只剩下RGB组件(即#RRGGBB) 生成的颜色必须与没有透明度的初始颜色相同 如何在Android的Java上实现这一点 更新:初始背景始终为白色(#FFF)试试看 #FF8F6509 前两位数字表示任何颜色的alpha值。我承认不知道Android的Java,但你不能将颜色从#6A8F6509更改为#FF8F6509吗?在大多数现代编程语言中,颜色通常编码为##aarggbb AA=Alpha的十六进制,范围从0(十六进制0

我有一个颜色
#6A8F6509

我希望删除该颜色的Alpha部分,只剩下RGB组件(即#RRGGBB)

生成的颜色必须与没有透明度的初始颜色相同

如何在Android的Java上实现这一点

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

试试看

#FF8F6509

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

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

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 );
-再次编辑-

好的,我已经使用维基百科的Alpha混合函数根据LJ2的答案重做了公式。并让一位同事通过Paint.Net确认了这一点。这是一个背景颜色完全不透明的版本,并且是C#,抱歉:


对每一个R、G和B值都这样做,您应该会得到正确的答案。在Android的Java中,double可以是double/Single/Float,int可以是Int32/Int16/Int64/Byte。不幸的是,我不记得在Java中如何在两者之间进行转换。

如果您想使用代码进行转换,可以尝试以下代码:

    static int stripAlpha(int color){
    return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
}
对于每种颜色: 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合成wiki页面获得的公式:


不幸的是,生成的颜色将取决于透明元素后面的内容,因此可能需要一些手动调整。您说希望它看起来相同,但它显示的颜色取决于它后面的内容,是否希望它保留从背景中获得的颜色?初始背景颜色始终设置为白色。生成的颜色需要看起来与初始设置相同,没有任何透明度。这不起作用,最终颜色与原始颜色完全不同。看起来非常接近。感谢这一点。Android Studio在使用颜色编辑器时应自动应用此公式。这不起作用,最终颜色r和原来的完全不同。你用我的方法得到的是什么颜色?我得到的是BDA56F。这应该是最快的操作,适合我
    static int stripAlpha(int color){
    return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
}
int newColor = oldColor | 0xFF000000;