[英]How to convert RGB to BGR?
這可能很容易,但是我正在嘗試從提供RGB字符串顏色的源轉換為Java中BGR字符串輸出的源。 我一直在動腦子,浪費時間在轉移和Long.decode和Long.toHexString上。
也可以在其中隨意輸入alpha值(RGBA-> ABGR),盡管我認為我可以擴展原理。
我可以假定十六進制是在long和int 解碼中指定的形式:
0x HexDigits
0X HexDigits
# HexDigits
對於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);
int abgr =整數。 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()));
}
如果輸入的是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 ) );
這應該工作。
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;
}
這就是我的工作方式,但是我真的希望有更好的方法,因為這很糟糕。 請提出一種更清潔,更有效的方法來完成此操作,以便我為您服務。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.