แปลงค่าสี RGB เป็นสตริงเลขฐานสิบหก


88

ในแอปพลิเคชัน Java ของฉันฉันได้รับColora JButtonในรูปแบบของสีแดงสีเขียวและสีน้ำเงิน ฉันเก็บค่าเหล่านี้ไว้เป็นสามintวินาที

ฉันจะแปลงค่า RGB เหล่านั้นให้เป็นค่าStringแทนเลขฐานสิบหกที่เทียบเท่าได้อย่างไร เช่น#0033fA

คำตอบ:


211

คุณสามารถใช้ได้

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

ใช้ตัวพิมพ์ใหญ่ X หากคุณต้องการให้เลขฐานสิบหกที่เป็นผลลัพธ์เป็นตัวพิมพ์ใหญ่ ( #FFFFFFเทียบกับ#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 ด้วยไวยากรณ์ของคุณคุณมีคำเตือนเนื่องจากคุณใช้ "int" แทน "Integer"
Stéphane Millien

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 สองครั้ง ฉันเปรียบเทียบโซลูชัน ARGB และเปรียบเทียบกับString.format():

ใส่คำอธิบายภาพที่นี่


11
โปรดทราบว่าวิธีนี้ใช้ไม่ได้หากสีของคุณมีค่าอัลฟา <16 (เช่นการแทนค่า ARGB ฐานสิบหกเริ่มต้นด้วย 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
คำตอบนี้จะล้มเหลวในกรณีที่ค่าสีแดงหรือสีเขียวเป็นศูนย์ (ตัวอย่างหนึ่งColor.BLUEซึ่งเป็นผลลัพธ์#0ffเนื่องจาก & 'ในค่า RGB ของ Color.BLUE ให้ผลลัพธ์256ในฐาน 10 ซึ่งเป็นเลขฐานffสิบหก) การแก้ไขคือการใช้whileลูปแทนคำสั่ง if เมื่อเติมค่าศูนย์ล่วงหน้า
FThompson

1

นี้เป็นรุ่นที่ดัดแปลงมาของคำตอบที่ได้รับจากวิเวียน Barousseกับการปรับปรุงจากวัลแคนนำมาใช้ ในตัวอย่างนี้ฉันใช้แถบเลื่อนเพื่อดึงค่า RGB แบบไดนามิกจากแถบเลื่อนสามตัวและแสดงสีนั้นในรูปสี่เหลี่ยมผืนผ้า จากนั้นในวิธี toHex () ฉันใช้ค่าเพื่อสร้างสีและแสดงรหัสสี Hex ตามลำดับ

ตัวอย่างนี้ไม่มีข้อ จำกัด ที่เหมาะสมสำหรับ 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.