RGB 색상 값을 16 진수 문자열로 변환


87

내 Java 애플리케이션에서 빨강, 녹색 및 파랑 측면에서 Colora 를 얻을 수있었습니다 JButton. 이 값을 3 int초 에 저장했습니다 .

RGB 값을 String해당하는 16 진수 표현을 포함하는 것으로 어떻게 변환 합니까? 같은#0033fA

답변:


206

당신이 사용할 수있는

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

결과 16 진수를 대문자로 표시하려면 대문자 X를 사용하십시오 ( #FFFFFFvs. #ffffff).


3
입력 유형 'Color': String.format ( "# % 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien

결과class java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82

@ smillien62 : 이것이 단순화 될 수 있다고 믿습니다String.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion, "Integer"대신 "int"를 사용하기 때문에 구문에 경고가 표시됩니다.
Stéphane Millien

46

하나의 라이너이지만 String.format모든 RGB 색상 에는 적용되지 않습니다 .

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

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

.toUpperCase()대문자로 전환하려면 a를 추가 할 수 있습니다 . 이것은 모든 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
색상의 알파 값이 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
이 대답은 빨강 또는 녹색 값이 0 인 경우에 실패합니다 (한 가지 예 는 Color.BLUE의 RGB 값을 & 'ing하면 16 진수 인 10 진법이 나오기 때문에 Color.BLUE출력 됨 ). 해결 방법은 0을 미리 표시 할 때 if 문 대신 루프 를 사용하는 것입니다. #0ff256ffwhile
FThompson

1

이것은 Vulcan 의 업데이트가 적용된 Vivien Barousse 가 제공 한 답변의 수정 된 버전입니다 . 이 예에서는 슬라이더를 사용하여 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;
  }
}

Vivien과 Vulcan 모두에게 큰 감사를드립니다. 이 솔루션은 완벽하게 작동하며 구현이 매우 간단했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.