【问题标题】:How to convert RGB to BGR?如何将RGB转换为BGR?
【发布时间】:2010-06-14 22:57:42
【问题描述】:

这可能很容易,但我正在尝试将提供 RGB 字符串颜色的源转换为 Java 中 BGR 字符串的输出。我一直在花时间在 shift 和 Long.decode 和 Long.toHexString 上。

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

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

0x HexDigits  
0X HexDigits 
# HexDigits

【问题讨论】:

    标签: java color-scheme


    【解决方案1】:

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

    【讨论】:

    • 好答案!如果我将颜色变量名称按顺序切换为红色绿色蓝色,则此选项有效。
    • 如果模式继续,此方法在添加可选 alpha 时也有效。如果缺少一个,您可以使用我的答案中的以下内容自动添加不透明的 alpha: long rgba = (rgbSource.length()
    【解决方案2】:

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

    【讨论】:

    • 看起来很吸引人,但 int in = Integer.decode(preferenceValue);字符串 abgrColor = Integer.toHexString(Integer.reverseBytes(in));有 #00ff0d -> dff0000
    • @Adam 这就是我在变量名中包含“a”的原因。如果使用代码在末尾添加“ff”,则 #00ff0dff 变为 ff0dff00
    • 我想我很困惑。我认为为了 alpha long 是需要的,因为#ffffffff(不透明的白色)大于 int max。当我用多头尝试同样的想法时,结果更差了。您使用的是无符号整数吗?
    • @Adam,Java 没有无符号整数,但它在 Integer 中确实有处理 32 位的方法,忽略高位作为符号位的特殊状态。 reverseBytes 方法使用 >>> 24 对高字节执行逻辑右移,从而无需将其与 0xFF 进行“与”。
    • @Adam javadocs on Integer.toHexString 说整数被视为无符号整数,因此无需使用 Long,尽管它没有任何区别。更值得关注的是,这两个 toHexString 方法都只返回足够的十六进制字符来表示数字。使用 String.format("%08X",abgr); 可能会更好
    【解决方案3】:

    如果输入的是一个 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 ) );
    

    【讨论】:

    • 这个答案也不错,但是在处理“#rrggbb”或“0xrrggbb”时没有使用“decode”函数的鲁棒性
    【解决方案4】:

    这是我如何让它工作的,但我真的希望有更好的方法,因为这太糟糕了。请想出一个更清洁、更有效的方法来执行此操作,以便我为您提供代表。

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

    【讨论】:

      【解决方案5】:

      这应该可行。

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

      【讨论】:

        猜你喜欢
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        相关资源
        最近更新 更多