Как конвертировать RGB в BGR? - PullRequest
1 голос
/ 15 июня 2010

Это, вероятно, просто, но я пытаюсь преобразовать из источника, который предоставляет цвета в строках RGB, в вывод в строках BGR в Java.Я тратил свой мозг и время на сдвиг и Long.decode и Long.toHexString.

Не стесняйтесь также добавлять туда альфа-значения (RGBA -> ABGR), хотя я думаю, что могу расширить принципы.

Я могу предположить, что гекс находится в форме, указанной вlong и int decode :

0x HexDigits  
0X HexDigits 
# HexDigits

Ответы [ 5 ]

7 голосов
/ 15 июня 2010

Для 24-битных цветов (8 бит для каждого из R, G, B):

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);
2 голосов
/ 15 июня 2010

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()));
}
1 голос
/ 15 июня 2010

Если ввод представляет собой 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);

Если ввод представляет собой int с 8-разряднымканалы:

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 ) );
0 голосов
/ 05 сентября 2012

Это должно работать.

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;
    }
0 голосов
/ 15 июня 2010

Вот как я заставил это работать, но я действительно надеюсь, что есть лучший способ, потому что это ужасно.Пожалуйста, придумайте более чистый и эффективный способ сделать это, чтобы я мог дать вам повторение.

...