RGBカラー値を16進文字列に変換します


88

私のJavaアプリケーションでは、私は得ることができたColorのをJButton、赤、緑、青の面で。これらの値を3int秒で保存しました。

これらのRGB値をString同等の16進表現を含むものに変換するにはどうすればよいですか?といった#0033fA

回答:


211

使用できます

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

結果の16進数を大文字にする場合は、大文字のXを使用します(#FFFFFFvs. #ffffff)。


3
入力タイプが「色」の場合:String.format( "#%06x"、Integer.valueOf(color.getRGB()&0x00FFFFFF));
ステファンミリエン

その結果、class java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig 8220年

@ smillien62:私はこれがに簡素化することができると信じてString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion、構文では、「整数」の代わりに「整数」を使用しているため、警告が表示されます。
ステファンミリエン

47

ワンライナーですが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を2回呼び出す必要があります。ARGBソリューションのベンチマークを行い、以下と比較しましたString.format()

ここに画像の説明を入力してください


11
色のアルファ値が16未満の場合(つまり、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
赤または緑の値がゼロの場合、この回答は失敗します(1つの例はColor.BLUE#0ffColor.BLUEのRGB値を& 'すると16進数の25610ff進数になるために出力されます)。修正は、whileゼロをプリプリメントするときにifステートメントではなくループを使用することです。
FThompson 2015年

1

これは、Vulcanからの更新が適用されたVivienBarousseによって与えられた回答の適応バージョンです。この例では、スライダーを使用して3つのスライダーからRGB値を動的に取得し、その色を長方形で表示します。次に、メソッドtoHex()で、値を使用して色を作成し、それぞれの16進カラーコードを表示します。

この例には、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;
  }
}

ヴィヴィアンとバルカンの両方に心から感謝します。このソリューションは完全に機能し、実装は非常に簡単でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.