【问题标题】:Convert integer color value to RGB将整数颜色值转换为 RGB
【发布时间】:2013-06-15 12:51:42
【问题描述】:

我正在尝试修改第三方软件。我想使用某些方法(我无法修改)返回的颜色作为整数。但是,我想使用 RGB 格式,例如#FF00FF。如何进行转换?

这是一个 HTML 示例 http://www.shodor.org/stella2java/rgbint.html 我想在 Android 上用 Java 归档同样的东西。

【问题讨论】:

    标签: java android colors type-conversion


    【解决方案1】:

    Tt 似乎引用的值和所需的格式不匹配。该值是十六进制的,而 RGB 将读取 255, 0, 255 并且整数是复合颜色表示。由于不清楚正在完成什么,以下是所有三种变体:

    如果你有一个复合颜色的整数,那么大多数颜色端点都会接受它而不加修改。这类似于setBackgroundColor(colorInt)

    如果您有十六进制值,则Color.parseColor(#colorHex) 会将其转换为颜色对象。

    同样,Color.rgb(redInt, greenInt, blueInt) 会将红色、绿色和蓝色值转换为颜色对象。

    如果您需要将复合整数恢复为颜色对象,使用Color.valueOf(colorInt) 会更简单

    【讨论】:

      【解决方案2】:

      使用这个

      String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
      

      我们知道 HEX 中颜色值的长度是 6。所以你在这里看到 6。 %06X 匹配来自 (0xFFFFFF & intColor) 的结果,如果长度小于 6,则通过在结果的左侧附加零来使结果为 6。你会看到 #,所以这个 # 字符会附加到结果中,最后你会得到一个 HEX COLOR 值。


      自 API 26 起更新

      自 API 26 起,出于类似原因,引入了新方法 Color.valueOf(....) 来转换颜色。你可以像使用它一样

      // sRGB
      Color opaqueRed = Color.valueOf(0xffff0000); // from a color int
      Color translucentRed = Color.valueOf(1.0f, 0.0f, 0.0f, 0.5f);
      
      // Wide gamut color
      ColorSpace sRgb = ColorSpace.get(ColorSpace.Named.SRGB);
      @ColorLong long p3 = Color.pack(1.0f, 1.0f, 0.0f, 1.0f, sRgb);
      Color opaqueYellow = Color.valueOf(p3); // from a color long
      
      // CIE L*a*b* color space
      ColorSpace lab = ColorSpace.get(Named.CIE_LAB);
      Color green = Color.valueOf(100.0f, -128.0f, 128.0f, 1.0f, lab);
      
      mView.setBackgroundColor(opaqueRed.toArgb());
      mView2.setBackgroundColor(green.toArgb());
      mView3.setBackgroundColor(translucentRed.toArgb());
      mView4.setBackgroundColor(opaqueYellow.toArgb());
      

      【讨论】:

      • 你问的是(0xFFFFFF & intColor)吗?如果是,这会将 int 值转换为十六进制。
      • 我对“#%06X”更感兴趣。这是一个正则表达式,我完全不明白。你能解释一下吗?
      • 实际上它的作用是:- 我们知道 HEX 中颜色值的长度是 6。所以你在这里看到 6。 %06X 匹配来自 (0xFFFFFF & intColor) 的结果,如果长度小于 6,则通过在结果左侧附加零来使结果为 6。你看到#,所以这个# 字符被附加到结果中,最后你得到一个十六进制颜色值。我现在清楚了吗?
      • 如果你有一个8字节的颜色值比如0xAARRGGBB,你可以使用String.format("#%06X", (0x00FFFFFF & intColor)) 来代替获取0xRRBBGG的值
      • @TheIT 感谢您提供宝贵的信息。它肯定会帮助很多人。
      【解决方案3】:

      我发现对我来说最简单和最好的解决方案是直接使用 Color 类,如下所示:

      int red = Color.red(intColor);
      int green = Color.green(intColor);
      int blue = Color.blue(intColor);
      int alpha = Color.alpha(intColor);
      

      这样我就可以处理整数值而不必处理字符串了。另一方面,如果您需要代表 rgb 颜色的字符串,那么 Pankaj Kumar 的答案是最好的。我希望这对某人有用。

      【讨论】:

      • 语法可能已经改变。除非有我不知道的静态 Color 类:new Color(intColor).getRed();
      • 我不知道...我已经很长时间没有在 Android 上工作了。如果您确定这一点,您可以使用此信息编辑我的答案,甚至可能使用发生此更改的版本
      • 这些是 Color 类的静态方法,所以这里显示的语法是正确的(并且在 Android 7 中对我有效)。
      • @AbandonedCart 我非常怀疑它是在 Android O 中引入的,因为这个答案早于那个版本。我刚刚检查了一下,它看起来像是来自 API 1: - developer.android.com/reference/android/graphics/Color#red(int) - developer.android.com/reference/android/graphics/Color
      • @AbandonedCart 也许我弄错了,但对我来说,我似乎正在使用自 API 1 以来可用的静态方法,并且我在之前的评论中提供了链接。由于 API 26 非常相似,因此您要链接的内容非常相似,但接受 long 值而不是 int
      【解决方案4】:

      SDK 26 you can just use

      Color c = Color.valueOf(colorInt);
      

      除此之外,似乎不可能从任意 argb 创建 Color 实例。底层代码使用私有构造函数:

      /**
       * Creates a new <code>Color</code> instance from an ARGB color int.
       * The resulting color is in the {@link ColorSpace.Named#SRGB sRGB}
       * color space.
       *
       * @param color The ARGB color int to create a <code>Color</code> from
       * @return A non-null instance of {@link Color}
       */
      @NonNull
      public static Color valueOf(@ColorInt int color) {
          float r = ((color >> 16) & 0xff) / 255.0f;
          float g = ((color >>  8) & 0xff) / 255.0f;
          float b = ((color      ) & 0xff) / 255.0f;
          float a = ((color >> 24) & 0xff) / 255.0f;
          return new Color(r, g, b, a, ColorSpace.get(ColorSpace.Named.SRGB));
      }
      

      【讨论】:

      • 获取整数 R、G 和 B 值。只需删除除法(/ 255.0f)并另存为int
      【解决方案5】:

      RGB 使用十六进制数字格式,。 如果您有整数值,请将其转换为十六进制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2020-01-16
        • 2011-05-05
        • 2011-01-26
        • 2011-01-04
        相关资源
        最近更新 更多