当前位置: 首页 > 知识库问答 >
问题:

如何使用位操作将RGB转换为RGBA

武友樵
2023-03-14

我花了一天左右的时间试图解决这个问题,我对发生的事情有点困惑。

本质上,我有这个方法,以便将BGR整数转换为RGB,并创建一个颜色出来

      Color c2 = new Color((BGRColorNumber & 0xFF),
    ((BGRColorNumber >> 8) & 0xFF),
    ((BGRColorNumber >> 16) & 0xFF));

颜色代码可以在这里找到http://www.endprod.com/colors/

这很好,但我现在尝试将其作为RGBA整数而不是RGB。我有点搞不清楚Alpha到底是如何适合RGB整数的。看起来,如果你只有RGB或BGR,或者任何你可以制作alpha 1.0/255的东西,或者还有更多吗?

这是我一直在使用的代码

public class test 
{

public static void main (String[] args)

{

    test t = new test();


    System.out.println(t.asIntRGBA(4823790));

}

    public int asIntRGBA(int BGRColorNumber)
{



    int rgba = 
              (((int) (BGRColorNumber         & 0xFF) & 0xFF) << 16)
            | (((int) ((BGRColorNumber >> 8)  & 0xFF) & 0xFF) << 8 )
            | (((int) (BGRColorNumber >> 16)  & 0xFF) & 0xFF)
            | (((int) ((BGRColorNumber >> 24) & 0xFF) & 0xFF) << 24);

    Color c = new Color(rgba);

  Color c2 = new Color((BGRColorNumber & 0xFF),
    ((BGRColorNumber >> 8) & 0xFF),
    ((BGRColorNumber >> 16) & 0xFF));


  Color c3 = new Color(15637065);
  System.out.println((((int) ((BGRColorNumber >> 24) & 0xFF) & 0xFF) << 24) + " : " + c.getAlpha());
    System.out.println(String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));
    System.out.println(String.format("#%02x%02x%02x%02x", c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()));
      System.out.println(String.format("#%02x%02x%02x%02x", c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()));
    return (rgba);
}

}

这是我的输出

0:255

“ee9a49ff”

“ee9a49ff”

“ee9a49ff”

15637065

如果我把它转换成一种颜色,然后输出RGBA,它就可以工作了,但是我想为什么要浪费一个对象的创建,然后获取值,而我只需要自己做colorInteger和按位移位操作呢?

在Alpha通道上执行操作时,它会给出00/0,但在使用颜色时。getAlpha();我得到了ff/255。。。。?

我也不是100%确定

在这种情况下,似乎Alpha位于24的最高位置,所以我假设这是最初的ABGR????

当我切换到

        int rgba = 
              (((int) (BGRColorNumber         & 0xFF) & 0xFF) << 24)
            | (((int) ((BGRColorNumber >> 8)  & 0xFF) & 0xFF) << 16)
            | (((int) ((BGRColorNumber >> 16)  & 0xFF) & 0xFF) << 8)
            | (((int)  (BGRColorNumber >> 24) & 0xFF) & 0xFF);

System.out.println(String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));

我的输出是“9a4900ff”,而不是“ee9a49ff”

但是如果我这么做了

System.out.println(String.format("#%02x%02x%02x%02x",  ((rgba >> 24) & 0xFF),  ((rgba >> 16) & 0xFF),  ((rgba >> 8) & 0xFF), ((rgba >> 0) & 0xFF)));

我得到了“#ee9a4900”,这基本上是正常的,除了阿尔法的00错误,除了它现在正在窃听trf。。。。???????00而不是ee,Alpha现在是ff而不是00?

所以我很困惑我到底做错了什么。。。?任何建议都将不胜感激!

谢谢

编辑:我意识到这可能是因为从0到16只有RGB位置,而24本身并不存在,这就是为什么我将任何东西转换为24都会得到00的原因。”

也许我会把255/ff放在24的阿尔法点上,今天到此为止。如果值是00,那么我只需要让它不是:)。

我仍然不明白为什么Color.getAlpha()返回ff,而不是00虽然...?

编辑2:

所以我最终解决了这个问题。

基本上,我在24号位置没有任何东西,只有0-23号被用完了。这意味着最后8个24-31的值为0。

我还意识到颜色给我ff/255的阿尔法值的原因,是因为我没有告诉颜色我有一个阿尔法值,因此它给它默认的ff/255。

By doing Color c = new Color (#, true);

我可以打开Alpha值。

下面是我解决问题的方法。

public class test 

{

public static void main (String[] args)
{

    test t = new test();


    System.out.println(t.asIntRGBA(4823790));

}

    public int asIntRGBA(int BGRColorNumber)
{



    int rgba = 
              (((int) (BGRColorNumber         & 0xFF) & 0xFF) << 24)
            | (((int) ((BGRColorNumber >> 8)  & 0xFF) & 0xFF) << 16 )
            | (((int) ((BGRColorNumber >> 16)  & 0xFF) & 0xFF) << 8)
            | ((int) (252 & 0xFF) & 0xFF);

    Color c = new Color(rgba, true);
   // Color c3 = Color.TRANSLUCENT;

  Color c2 = new Color((BGRColorNumber & 0xFF),
    ((BGRColorNumber >> 8) & 0xFF),
    ((BGRColorNumber >> 16) & 0xFF), 252);


  Color c3 = new Color(-51471799, true);
  System.out.println(((rgba >> 24) & 0xFF) + " | " +  c.getRed() +  " | " + c.getGreen() + " | " + c.getBlue() + " | " + c.getAlpha());
  //System.out.println(();
    System.out.println(String.format("#%02x%02x%02x%02x",((rgba >> 24) & 0xFF), ((rgba >> 16) & 0xFF), ((rgba >> 8) & 0xFF), ((rgba) & 0xFF)));
    System.out.println(String.format("#%02x%02x%02x%02x", c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()));
      System.out.println(String.format("#%02x%02x%02x%02x", c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()));
    return (rgba);
}

}

我改变了获取值与

根据上述页面,这给出了正确的值,并对应于正确的十六进制值。。

然而,我有一个问题

  System.out.println(String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));

是正确的

正确输出:

“#ee9a49fc”

颜色输出:

“#9a49fcee”

如果我从rgba"-291878404"获取int值并将其插入颜色c3,则会得到与颜色c相同的值。我不知道出了什么问题,但我很难让一切都保持不变。

rgba

共有1个答案

宋畅
2023-03-14

所以我遇到了一点麻烦,但我最终解决了这个问题。

基本上,我只能使用位0-23,因为位24-31没有给出任何数据。

所以首先我必须把Alpha加到24-31位,然后我必须把所有的东西从ARGB位移到合适的RGBA顺序。

如果我尝试将所有内容转换为RGBA顺序,我会遇到问题,因为24中没有任何内容,并且由于某些原因,转换操作不喜欢正在进行的操作,所以我只做了两次整数操作。

public class test 
{


public static void main (String[] args)
    {

        test t = new test();


        t.asIntRGBA(4823790);

    }

    public int asIntRGBA(int BGRColorNumber)
    {

        /*  
         *  First set of bit-wise shifts take the BGR value and swaps it into RGB values:
         *  Bits 24-31 - Alpha (Added in through this operation)
         *  Bits 16-23 - Red  (Originally Bits 0-7)
         *  Bits  8-15 - Green
         *  Bits   0-7 - Blue (Originally Bits 16-23)
         *  
         *  Seeing as we want Red as 24-31, and Alpha as 0-7, we need to do another bit-wise routine.
         *  We first have to add bit data to 24-31, before being able to shift it around.
         *  If you try to shift bits over in one routine it causes jumbling of bit data that isn't correct.
         *
         */

        /* 

        *  The Bit-Wise shift of (value >> #) is taking the value at Bit #.

        *  While the Bit-Wise sift of (x << #) takes the data of x, and puts it into Bit #.

        */

        int rgba = (((int) ((BGRColorNumber      )& 0xFF) & 0xFF) << 16)
                | (((int) ((BGRColorNumber >> 8 )& 0xFF) & 0xFF) << 8)
                | (((int) ((BGRColorNumber >> 16)& 0xFF) & 0xFF)    )
                | (((int) (25 & 0xFF) << 24));



       /*Once an Alpha value is stored in 24-31, you can now swap everything where they should be.

        * Since blue and red were swapped we now use (>> 16, not (>> 0/blank)).
        * As you can see we also swapped (<< 16 for << 24),
        * since now we are taking the value in Bits 16-23
        *                 and shifting them to Bits 24-31.

        * After this Bit-Wise shift we now have    

        *  Bits 24-31 - Red   (Originally Bits 16-23)
        *  Bits 16-23 - Green (Originally Bits 8-15)
        *  Bits  8-15 - Blue  (Originally Bits 0-7)
        *  Bits   0-7 - Alpha (Originally Bits 24-31)

        */
        int rgba2 = (((int) (rgba >> 16) & 0xFF) << 24)
                | (((int) (rgba >> 8 ) & 0xFF) << 16)
                | (((int) (rgba      ) & 0xFF) << 8)
                | (((int) (rgba >> 24) & 0xFF));



        Color c = new Color(rgba, true);

        Color c2 = new Color((BGRColorNumber & 0xFF),
                            ((BGRColorNumber >> 8) & 0xFF),
                            ((BGRColorNumber >> 16) & 0xFF), 252);


        Color c3 = new Color(435067465, true);
        System.out.println(rgba);
        System.out.println(((rgba2 >> 24) & 0xFF) + " | " +  c.getRed() +  " | " + c.getGreen() + " | " + c.getBlue() + " | " + c.getAlpha());
      //System.out.println(String.format("#%02x%02x%02x%02x%02x",((rgba >> 24) & 0xFF), c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));


      //System.out.println(String.format("#%02x%02x%02x%02x",((rgba >> 24) & 0xFF), ((rgba >> 16) & 0xFF), ((rgba >> 8) & 0xFF), ((rgba) & 0xFF)));
       //System.out.println(String.format("#%02x%02x%02x%02x", c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()));
        System.out.println(String.format("#%02x%02x%02x%02x",((rgba >> 16) & 0xFF), ((rgba >> 8) & 0xFF), ((rgba >> 0) & 0xFF), ((rgba >> 24 ) & 0xFF)));
        System.out.println(String.format("#%02x%02x%02x%02x",((rgba2 >> 24) & 0xFF), ((rgba2 >> 16) & 0xFF), ((rgba2 >> 8) & 0xFF), ((rgba2 >> 0 ) & 0xFF)));
        System.out.println(String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));
        System.out.println(String.format("#%02x%02x%02x%02x", c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()));

        return (rgba);
    }

}
 类似资料:
  • 所以,我创建一个图形Bash PS1生成器使用Javascript。用户可以从调色板(jsColor库)中为他们想要的任何元素选择任何颜色。我得到的值是该颜色的RGB代表。我想将该值转换为0-255之间的数字,以便在Bash中表示。 示例: 输入:#000000 输出:0 输入:#FFFFFF 输出: 255 转换为最接近的8位表示形式的任何其他输入 **我检查了这篇文章,但答案不太起作用(我得到

  • 问题内容: 如何在Java中将十六进制颜色转换为RGB代码?在Google中,大多数示例是关于如何从RGB转换为十六进制的。 问题答案: 我想应该这样做:

  • 更新2:XSSFWorkbook不提供对调色板的访问,因此我要问以下问题:访问XSSFWorkbook中的调色板

  • 问题内容: 我在互联网上找到了一种将RGB值转换为HSV值的方法。不幸的是,当值是R = G = B时,由于0/0操作,我得到的是NaN。 您是否知道Java中是否存在用于此转换的实现方法,或者当我获得0/0除法以获取正确的HSV值时该怎么办? 这是我的方法,它是根据Internet上的一些代码改编而成的: 问题答案: 我很确定您想要的是RGBtoHSB

  • 问题内容: 如何在CIE Lab颜色模型中显示对象颜色。 但是我无法通过CIE Lab强制进行这项工作(尽管TYPE_Lab是在ColorSpace类中提供的) 谢谢。 问题答案: 这是我的实现:

  • 问题内容: 我有一个RGB图像。我想将其转换为numpy数组。我做了以下 它创建一个没有形状的数组。我假设它是一个iplimage对象。 问题答案: 您可以使用较新的OpenCV python接口(如果我没记错的话,自Ope​​nCV 2.2起就可以使用)。它本机使用numpy数组: 结果: