Chuyển đổi giá trị màu RGB thành chuỗi thập lục phân


87

Trong ứng dụng Java của tôi, tôi đã có thể nhận được Colora JButtonvề màu đỏ, xanh lá cây và xanh lam; Tôi đã lưu trữ các giá trị này trong ba intgiây.

Làm cách nào để chuyển đổi các giá trị RGB đó thành một Stringchứa biểu diễn thập lục phân tương đương? Nhu la#0033fA

Câu trả lời:


206

Bạn có thể dùng

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

Sử dụng chữ X viết hoa nếu bạn muốn các chữ số lục phân kết quả được viết hoa ( #FFFFFFso với #ffffff).


3
Với kiểu đầu vào 'Màu': String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien

Điều này dẫn đếnclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82

@ smillien62: Tôi tin rằng điều này có thể được đơn giản hóa thànhString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion, Với cú pháp của bạn, bạn có một cảnh báo vì bạn sử dụng "int" thay vì "Integer".
Stéphane Millien

46

Một lớp lót duy nhất nhưng không có String.formatcho tất cả các màu RGB :

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

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

Bạn có thể thêm dấu .toUpperCase()nếu muốn chuyển sang chữ in hoa. Lưu ý rằng điều này hợp lệ (như đã hỏi trong câu hỏi) cho tất cả các màu RGB.

Khi bạn có màu ARGB, bạn có thể sử dụng:

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

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

Về mặt lý thuyết, cũng có thể sử dụng một lớp lót nhưng sẽ yêu cầu gọi toHexString hai lần. Tôi đã chuẩn hóa giải pháp ARGB và so sánh nó với String.format():

nhập mô tả hình ảnh ở đây


11
Lưu ý rằng phương pháp này bị hỏng nếu màu của bạn có giá trị alpha <16 (nghĩa là biểu diễn ARGB thập lục phân của nó bắt đầu bằng 0).
ARRG

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
Câu trả lời này không thành công trong trường hợp các giá trị màu đỏ hoặc xanh lá cây bằng 0 (một ví dụ là Color.BLUE, giá trị này xuất ra #0ffdo & 'nhập giá trị RGB của Color.BLUE dẫn 256đến cơ số 10, ffở dạng hex). Cách khắc phục là sử dụng whilevòng lặp thay vì câu lệnh if khi trả trước các số 0.
FThompson

1

Đây là phiên bản điều chỉnh của câu trả lời do Vivien Barousse đưa ra với bản cập nhật từ Vulcan được áp dụng. Trong ví dụ này, tôi sử dụng thanh trượt để truy xuất động các giá trị RGB từ ba thanh trượt và hiển thị màu đó trong một hình chữ nhật. Sau đó, trong phương thức toHex (), tôi sử dụng các giá trị để tạo màu và hiển thị mã màu Hex tương ứng.

Ví dụ này không bao gồm các ràng buộc thích hợp cho GridBagLayout. Mặc dù mã sẽ hoạt động, nhưng màn hình sẽ trông lạ.

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

Xin gửi lời cảm ơn sâu sắc tới cả Vivien và Vulcan. Giải pháp này hoạt động hoàn hảo và cực kỳ đơn giản để thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.