簡體   English   中英

怎么把RGB轉換成BGR?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM