将RGB颜色值转换为十六进制字符串


87

在我的Java应用程序,我能得到ColorJButton中的红色,绿色和蓝色的条款; 我将这些值存储在3int秒内。

如何将这些RGB值转换为String包含等效十六进制表示形式的?如#0033fA

Answers:


206

您可以使用

String hex = String.format("#%02x%02x%02x", r, g, b);  

资金使用X如果你希望你得到的十六进制数字予以资本化(的#FFFFFF对比#ffffff)。


3
输入类型为'Color':String.format(“#%06x”,Integer.valueOf(color.getRGB()&0x00FFFFFF));
21StéphaneMillien

其结果是class java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82

@ smillien62:我相信可以简化为String.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion,使用您的语法会发出警告,因为您使用的是“ int”而不是“ Integer”。
斯特凡Millien

46

一个衬板,但不String.format包含所有RGB颜色:

Color your_color = new Color(128,128,128);

String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);

.toUpperCase()如果要切换到大写字母,可以添加一个。请注意,这对于所有RGB颜色都是有效的(如问题中所述)。

当您具有ARGB颜色时,可以使用:

Color your_color = new Color(128,128,128,128);

String buf = Integer.toHexString(your_color.getRGB());
String hex = "#"+buf.substring(buf.length()-6);

理论上也可以使用一个内衬,但需要两次调用toHexString。我对ARGB解决方案进行了基准测试,并将其与String.format()

在此处输入图片说明


11
请注意,如果您的颜色的Alpha值小于16(即,其十六进制ARGB表示形式以0开头),则此方法无效。
ARRG 2014年

15
Random ra = new Random();
int r, g, b;
r=ra.nextInt(255);
g=ra.nextInt(255);
b=ra.nextInt(255);
Color color = new Color(r,g,b);
String hex = Integer.toHexString(color.getRGB() & 0xffffff);
if (hex.length() < 6) {
    hex = "0" + hex;
}
hex = "#" + hex;

3
如果红色或绿色值为零(一个示例为Color.BLUE,则输出,#0ff因为Color.BLUE的RGB值&'ing以25610为底,ff以十六进制表示),此答案失败。一种解决方法是while在加零之前使用循环而不是if语句。
FThompson

1

这是Vivien Barousse给出的答案的改编版本,并应用了Vulcan的更新。在此示例中,我使用滑块从三个滑块动态获取RGB值并将其显示为矩形。然后在toHex()方法中,我使用这些值创建颜色并显示相应的十六进制颜色代码。

此示例不包括GridBagLayout的适当约束。尽管代码可以工作,但显示效果看起来很奇怪。

public class HexColor
{

  public static void main (String[] args)
  {
   JSlider sRed = new JSlider(0,255,1);
   JSlider sGreen = new JSlider(0,255,1);
   JSlider sBlue = new JSlider(0,255,1);
   JLabel hexCode = new JLabel();
   JPanel myPanel = new JPanel();
   GridBagLayout layout = new GridBagLayout();
   JFrame frame = new JFrame();

   //set frame to organize components using GridBagLayout 
   frame.setLayout(layout);

   //create gray filled rectangle 
   myPanel.paintComponent();
   myPanel.setBackground(Color.GRAY);

   //In practice this code is replicated and applied to sGreen and sBlue. 
   //For the sake of brevity I only show sRed in this post.
   sRed.addChangeListener(
         new ChangeListener()
         {
             @Override
             public void stateChanged(ChangeEvent e){
                 myPanel.setBackground(changeColor());
                 myPanel.repaint();
                 hexCode.setText(toHex());
         }
         }
     );
   //add each component to JFrame
   frame.add(myPanel);
   frame.add(sRed);
   frame.add(sGreen);
   frame.add(sBlue);
   frame.add(hexCode);
} //end of main

  //creates JPanel filled rectangle
  protected void paintComponent(Graphics g)
  {
      super.paintComponent(g);
      g.drawRect(360, 300, 10, 10);
      g.fillRect(360, 300, 10, 10);
  }

  //changes the display color in JPanel
  private Color changeColor()
  {
    int r = sRed.getValue();
    int b = sBlue.getValue();
    int g = sGreen.getValue();
    Color c;
    return  c = new Color(r,g,b);
  }

  //Displays hex representation of displayed color
  private String toHex()
  {
      Integer r = sRed.getValue();
      Integer g = sGreen.getValue();
      Integer b = sBlue.getValue();
      Color hC;
      hC = new Color(r,g,b);
      String hex = Integer.toHexString(hC.getRGB() & 0xffffff);
      while(hex.length() < 6){
          hex = "0" + hex;
      }
      hex = "Hex Code: #" + hex;
      return hex;
  }
}

非常感谢Vivien和Vulcan。该解决方案工作完美,实现起来非常简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.