如何将RGB转换为BGR?

时间:2010-06-14 22:57:43

标签: java color-scheme

这可能很简单,但我正在尝试从提供RGB字符串颜色的源转换为Java中BGR字符串的输出。我一直在努力改变我的大脑和时间以及Long.decode和Long.toHexString。

随意抛出alpha值(RGBA - > ABGR),不过我认为我可以扩展原则。

我可以假设hex是long和int decode中指定的形式:

0x HexDigits  
0X HexDigits 
# HexDigits

5 个答案:

答案 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;
    }