Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将RGB转换为BGR?_Java_Color Scheme - Fatal编程技术网

Java 如何将RGB转换为BGR?

Java 如何将RGB转换为BGR?,java,color-scheme,Java,Color Scheme,这可能很简单,但我正在尝试将RGB字符串中提供颜色的源代码转换为Java中BGR字符串中的输出。我一直在绞尽脑汁,花时间研究移位和Long.decode和Long.tohextstring 尽管我认为我可以扩展这些原则,但也可以随意在其中抛出alpha值(RGBA->ABGR) 我可以假设十六进制是long和int中指定的形式: 对于24位颜色(R、G、B各8位): String rgbSource=getRGBSource()//您的函数可以获取它的字符串版本 int in=Integer.d

这可能很简单,但我正在尝试将RGB字符串中提供颜色的源代码转换为Java中BGR字符串中的输出。我一直在绞尽脑汁,花时间研究移位和Long.decode和Long.tohextstring

尽管我认为我可以扩展这些原则,但也可以随意在其中抛出alpha值(RGBA->ABGR)

我可以假设十六进制是long和int中指定的形式:

对于24位颜色(R、G、B各8位):

String rgbSource=getRGBSource()//您的函数可以获取它的字符串版本
int in=Integer.decode(rgbSource);
int red=(在>>16中)&0xFF;
绿色整数=(在>>8中)&0xFF;
蓝色整数=(在>>0中)&0xFF;
int out=(24位颜色的蓝色(R、G、B各8位):

String rgbSource=getRGBSource();//获取字符串版本的函数
int in=Integer.decode(rgbSource);
int red=(在>>16中)&0xFF;
绿色整数=(在>>8中)&0xFF;
蓝色整数=(在>>0中)&0xFF;
int out=(蓝色int abgr=整数)(rgba)


包括支持代码,假设根据字符串长度确定是否需要添加alpha是安全的(例如考虑
“0xFFFFFF”.length()
):

String rgb=getRGB();
//解码多种十六进制格式并设置alpha
int rgba=rgb.length()<8?
Long.decode(rgb+“ff”).intValue():
Long.decode(rgb.intValue();
int abgr=整数。反向字节(rgba);

这里有一个单行方法:

public static String reverseRGB(String rgba) {
    return String.format("%08X",Integer.reverseBytes(Long.decode(rgba.length() < 8 ? rgba + "ff" : rgba).intValue()));
}
公共静态字符串反转器RGB(字符串rgba){
返回String.format(“%08X”,Integer.reverseBytes)(Long.decode(rgba.length()<8?rgba+“ff”:rgba.intValue());
}
int abgr=整数(rgba)


包括支持代码,假设根据字符串长度确定是否需要添加alpha是安全的(例如考虑
“0xFFFFFF”.length()
):

String rgb=getRGB();
//解码多种十六进制格式并设置alpha
int rgba=rgb.length()<8?
Long.decode(rgb+“ff”).intValue():
Long.decode(rgb.intValue();
int abgr=整数。反向字节(rgba);

这里有一个单行方法:

public static String reverseRGB(String rgba) {
    return String.format("%08X",Integer.reverseBytes(Long.decode(rgba.length() < 8 ? rgba + "ff" : rgba).intValue()));
}
公共静态字符串反转器RGB(字符串rgba){
返回String.format(“%08X”,Integer.reverseBytes)(Long.decode(rgba.length()<8?rgba+“ff”:rgba.intValue());
}

以下是我如何让它工作的,但我真的希望有更好的方法,因为这太糟糕了。请想出一个更干净、更有效的方法来做这件事,这样我可以给你一个代表

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();
long number=(rgb.length()<8?long.decode(rgb+“ff”):long.decode(rgb));//解码许多十六进制格式并设置alpha
字符串abgrColor=(新的StringBuilder())
.append((Long.tohextstring((number)和0xFF).length()==2?Long.tohextstring((number)和0xFF):“0”+Long.tohextstring((number)和0xFF)))
.append((Long.toHexString((number>>8)&0xFF).length()==2?Long.toHexString((number>>8)&0xFF):“0”+Long.toHexString((number>>8)&0xFF)))
.append((Long.tohextstring((number>>16)和0xFF).length()==2?Long.tohextstring((number>>16)和0xFF):“0”+Long.tohextstring((number>>16)和0xFF)))
.append((Long.toHexString((number>>24)&0xFF).length()==2?Long.toHexString((number>>24)&0xFF):“0”+Long.toHexString((number>>24)&0xFF)))
.toString();

以下是我如何让它工作的,但我真的希望有更好的方法,因为这太糟糕了。请想出一个更干净、更有效的方法来做这件事,这样我可以给你一个代表

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();
long number=(rgb.length()<8?long.decode(rgb+“ff”):long.decode(rgb));//解码许多十六进制格式并设置alpha
字符串abgrColor=(新建StringBuilder())
.append((Long.tohextstring((number)和0xFF).length()==2?Long.tohextstring((number)和0xFF):“0”+Long.tohextstring((number)和0xFF)))
.append((Long.toHexString((number>>8)&0xFF).length()==2?Long.toHexString((number>>8)&0xFF):“0”+Long.toHexString((number>>8)&0xFF)))
.append((Long.tohextstring((number>>16)和0xFF).length()==2?Long.tohextstring((number>>16)和0xFF):“0”+Long.tohextstring((number>>16)和0xFF)))
.append((Long.toHexString((number>>24)&0xFF).length()==2?Long.toHexString((number>>24)&0xFF):“0”+Long.toHexString((number>>24)&0xFF)))
.toString();

如果输入为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位通道的整数:

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

如果输入为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位通道的整数:

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;
    }
公共静态整数交换字节1和3(整数无效){
整数交换=无效&0xFF;
交换=交换>>16&0xFF);
返回无效&0xFF00FF00;交换;
}
公共静态int-convertBRGtoRBG(int-inColor){
返回SWAPByte1和3(不着色);
}
公共静态int转换器ABRGTORBGA(int彩色){
int swap=inColor>>>24;
inColor=convertBRGtoRBG(inColor)这应该可以工作

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;
    }
公共静态整数交换字节1和3(整数无效){
整数交换=无效&0xFF;
交换=交换>>16&0xFF);
返回无效&0xFF00FF00;交换;
}
公共静态int-convertBRGtoRBG(int-inColor){
返回SWAPByte1和3(不着色);
}
公共静态int转换器ABRGTORBGA(int彩色){
int swap=inColor>>>24;

inColor=convertBRGtoRBG(inColor)看起来很吸引人,但int in=Integer.decode(preferenceValue);String abgrColor=Integer.tohextstring(Integer.reverseebytes(in));had#00ff0d->dff0000@Adam这就是为什么我在变量名中包含“a”。如果添加“ff”最后使用你的代码,然后#00ff0dff变成了ff0dff00f,我想我有点困惑。我认为为了得到alpha long,需要使用#ffffffff(不透明白色)比int max大。当我用long尝试同样的想法时,结果更加离谱。你使用了无符号整数吗?@Adam,Java没有无符号整数