android 从颜色中删除Alpha,但保留其纹理

gzjq41n4  于 2022-12-31  发布在  Android
关注(0)|答案(7)|浏览(147)

我有一种颜色#6A8F6509
我希望删除该颜色的Alpha部分,只留下RGB分量(即#RRGGBB)。
生成的颜色必须看起来与没有透明度的初始颜色相同。
如何在Android的Java上实现这一点?

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

piwo6bdm

piwo6bdm1#

int newColor = oldColor | 0xFF000000;
1tuwyuhd

1tuwyuhd2#

如果你想做的代码,你可以尝试以下代码:

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

svujldwt3#

对于每种颜色: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
z0qdvdin

z0qdvdin4#

尝试

#FF8F6509

前两个数字表示任何颜色的α值。

mtb9vblg

mtb9vblg5#

计算将半透明颜色放置在另一种颜色上时的外观。

Kotlin颜色扩展:

@ColorInt
fun @receiver:ColorInt Int.removeAlpha(@ColorInt underlyingColor: Int): Int {
    return ColorUtils.blendARGB(this, underlyingColor, alpha / 255F)
}

用法:

Color.parseColor("#6A8F6509").removeAlpha(underlyingColor = Color.WHITE)
siotufzp

siotufzp6#

Jetpack合成版本为

Color(0x6A8F6509).compositeOver(Color.White)
cuxqih21

cuxqih217#

我承认我不知道Android的Java,但是你不能把颜色从#6A8F6509改为#FF8F6509吗?在大多数现代编程语言中,颜色通常编码为##AARRGBB。
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 );
  • 再编辑一遍
    好的,我已经使用Wikipedia的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值都这样做,你应该会得到正确的答案。如果Android的Java有不同的,double可以是Double/Single/Float,int可以是Int32/Int16/Int64/Byte。不幸的是,我不记得如何在Java中转换这两个值。

相关问题