我花了一天左右的时间试图解决这个问题,我对发生的事情有点困惑。
本质上,我有这个方法,以便将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
所以我遇到了一点麻烦,但我最终解决了这个问题。
基本上,我只能使用位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接口(如果我没记错的话,自OpenCV 2.2起就可以使用)。它本机使用numpy数组: 结果: