这可能很简单,但我正在尝试从提供RGB字符串颜色的源转换为Java中BGR字符串的输出。我一直在努力改变我的大脑和时间以及Long.decode和Long.toHexString。
随意抛出alpha值(RGBA - > ABGR),不过我认为我可以扩展原则。
我可以假设hex是long和int decode中指定的形式:
0x HexDigits
0X HexDigits
# HexDigits
答案 0 :(得分:7)
对于24位颜色(R,G,B各8位):
String rgbSource = getRGBSource(); //your function to get a string version of it
int in = Integer.decode(rgbSource);
int red = (in >> 16) & 0xFF;
int green = (in >> 8) & 0xFF;
int blue = (in >> 0) & 0xFF;
int out = (blue << 16) | (green << 8) | (red << 0);
答案 1 :(得分:2)
int abgr = Integer。reverseBytes(rgba);
包括支持代码,假设可以安全地确定alpha是否需要根据字符串长度添加(例如,考虑"0xFFFFFF".length()
):
String rgb = getRGB();
//decodes a number of hex formats and sets alpha
int rgba = rgb.length() < 8 ?
Long.decode(rgb + "ff").intValue() :
Long.decode(rgb ).intValue();
int abgr = Integer.reverseBytes(rgba);
这是一个单行方法:
public static String reverseRGB(String rgba) {
return String.format("%08X",Integer.reverseBytes(Long.decode(rgba.length() < 8 ? rgba + "ff" : rgba).intValue()));
}
答案 2 :(得分:1)
如果输入是6个字符的rgb字符串:
String bgr = rgb.substring(4,6) + rgb.substring(2,4) + rgb.substring(0,2);
如果输入是8个字符的rgba字符串:
String abgr = rgba.substring(6,8) + rgba.substring(4,6) + rgba.substring(2,4) + rgba.substring(0,2);
如果输入是带有8位通道的int:
String bgr = String.format( "%02X%02X%02X" , rgb & 0x00FF , (rgb>>8) & 0x00FF , (rgb>>16) & 0x00FF );
String abgr = String.format( "%02X%02X%02X%02X" , rgba & 0x00FF , (rgba>>8) & 0x00FF , (rgba>>16) & 0x00FF , (rgba>>24) & 0x00FF );
// or
String bgr = String.format( "%06X" , Integer.reverseBytes( rgb ) >> 8 );
String abgr = String.format( "%08X" , Integer.reverseBytes( rgba ) );
答案 3 :(得分:0)
以下是我如何使用它,但我真的希望有更好的方法,因为这很糟糕。请想出一个更干净,更有效的方法来做到这一点,所以我可以给你代表。
long number = (rgb.length() < 8 ? Long.decode(rgb+ "ff") : Long.decode(rgb)); //decodes a number of hex formats and sets alpha
String abgrColor = (new StringBuilder())
.append((Long.toHexString((number) & 0xFF).length()==2? Long.toHexString((number) & 0xFF): "0"+Long.toHexString((number) & 0xFF)))
.append((Long.toHexString((number>>8) & 0xFF).length()==2? Long.toHexString((number>>8) & 0xFF): "0"+Long.toHexString((number>>8) & 0xFF)))
.append((Long.toHexString((number>>16) & 0xFF).length()==2? Long.toHexString((number>>16) & 0xFF): "0"+Long.toHexString((number>>16) & 0xFF)))
.append((Long.toHexString((number>>24) & 0xFF).length()==2? Long.toHexString((number>>24) & 0xFF): "0"+Long.toHexString((number>>24) & 0xFF)))
.toString();
答案 4 :(得分:0)
这应该有效。
public static int swapByte1And3(int inValue) {
int swap = inValue & 0xFF;
swap = swap << 16 | (inValue >>> 16 & 0xFF);
return inValue & 0xFF00FF00 | swap;
}
public static int convertBRGtoRBG(int inColor) {
return swapByte1And3(inColor);
}
public static int convertABRGtoRBGA(int inColor) {
int swap = inColor >>> 24;
inColor = convertBRGtoRBG(inColor) << 8;
return inColor | swap;
}