【问题标题】:Remove the alpha from a colour but retain its texture从颜色中移除 alpha 但保留其纹理
【发布时间】:2011-12-06 04:00:13
【问题描述】:

我有颜色#6A8F6509

我希望删除该颜色的 Alpha 部分,只留下 RGB 分量(即#RRGGBB)。

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

如何在 Android 的 Java 上解决这个问题?

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

【问题讨论】:

  • 不幸的是,生成的颜色将取决于透明元素背后的内容,因此这可能需要进行一些手动调整。
  • 你说你想让它看起来一样,但是它出现的颜色取决于它背后的东西,你想让它保留它从背景中得到的东西吗?
  • 初始背景颜色始终设置为白色。生成的颜色需要看起来与初始设置相同,没有任何透明度。

标签: java android colors


【解决方案1】:
int newColor = oldColor | 0xFF000000;

【讨论】:

  • 这应该也是最快的操作,适合我
【解决方案2】:

如果你想用代码来做,你可以试试下面的代码:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

    试试

    #FF8F6509
    

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

    【讨论】:

      【解决方案5】:

      我承认不知道 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 );
      

      -再次编辑-

      好的,我已经根据 LJ2 的答案使用 Wikipedia 的 Alpha Blending 函数重做公式。并让一位同事通过 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 中进行两者之间的转换。

      【讨论】:

      • 这不行,最终的颜色和原来的完全不同。
      • 你用我的方法得到什么颜色?我得到 BDA56F。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2015-02-03
      • 2020-12-26
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多