2010-06-14 5 views
1

Ceci est probablement facile, mais j'essaie de convertir à partir d'une source qui fournit des couleurs dans les chaînes RGB à une sortie dans les chaînes BGR en Java. J'ai brisé mon cerveau et mon temps sur le décalage et Long.decode et Long.toHexString. N'hésitez pas à jeter également des valeurs alpha là-bas (RGBA -> ABGR), mais je pense que je peux étendre les principes.Comment convertir les RGB en BGR?

I peut supposer que l'hexagone est dans la forme indiquée dans le long et int decode:

0x HexDigits 
0X HexDigits 
# HexDigits 

Répondre

7

Pour les couleurs de 24 bits (8 bits pour chacun des groupes 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); 
+0

bonne réponse! Celui-ci a fonctionné si j'ai changé les noms des variables de couleur pour être dans l'ordre, rouge vert bleu. – Adam

+0

Oups. Je l'ai réparé maintenant. :) – Mike

+0

Cette méthode fonctionne également lors de l'ajout d'un alpha optionnel si le motif est poursuivi. Vous pouvez utiliser ce qui suit de ma réponse à auto ajouter un alpha opaque s'il en manque: long rgba = (rgbSource.length() <8? Long.decode (rgbSource + "ff"): Long.decode (rgbSource)); // décode un certain nombre de formats hexadécimaux et définit des valeurs alpha – Adam

2

int abgr = Entier. reverseBytes (rgba);


Y compris le code de soutien, en supposant qu'il est sûr de décider si les besoins en alpha ajoutant en fonction de la longueur de la chaîne (pensez "0xFFFFFF".length() par exemple):

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); 

est ici une ligne méthode:

public static String reverseRGB(String rgba) { 
    return String.format("%08X",Integer.reverseBytes(Long.decode(rgba.length() < 8 ? rgba + "ff" : rgba).intValue())); 
} 
+0

attrayantes, mais \t \t int in = Integer.decode (preferenceValue); Chaîne abgrColor = Integer.toHexString (Integer.reverseBytes (in)); avait # 00ff0d -> dff0000 – Adam

+0

@Adam c'est pourquoi j'ai inclus "a" dans les noms de variables. Si vous ajoutez "ff" à la fin en utilisant votre code, alors # 00ff0dff devient ff0dff00 –

+0

Je suppose que je suis confus. J'ai pensé que pour alpha long serait nécessaire car #ffffffff (blanc opaque) est plus grand que int max. Quand j'ai essayé cette même idée avec des longs, le résultat était encore plus loin. Avez-vous utilisé des ints non signés? – Adam

0

Voici comment je l'ai eu à travailler, mais j'espère vraiment qu'il y a un pari ter moyen parce que c'est horrible. S'il vous plaît venir avec un moyen plus propre et plus efficace pour ce faire, afin que je puisse vous donner un représentant.

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(); 
1

Si l'entrée est une chaîne de rgb à 6 caractères:

String bgr = rgb.substring(4,6) + rgb.substring(2,4) + rgb.substring(0,2); 

Si l'entrée est une chaîne de rgba 8 caractères:

String abgr = rgba.substring(6,8) + rgba.substring(4,6) + rgba.substring(2,4) + rgba.substring(0,2); 

Si l'entrée est un entier de 8 bits canaux:

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

Cette réponse est également bonne, mais elle n'a pas la robustesse d'utiliser une fonction de "décodage" avec "#rrggbb" ou "0xrrggbb" – Adam

0

Cela devrait travail.

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; 
    } 
Questions connexes