RGB Renk Değerini Onaltılık Dizeye Dönüştürme


88

Benim Java uygulaması, ben başardı Colora JButtonkırmızı, yeşil ve mavi açısından; Bu değerleri üç intsaniyede sakladım.

Bu RGB değerlerini Stringeşdeğer onaltılık gösterimi içeren bir şeye nasıl dönüştürebilirim ? Gibi#0033fA

Yanıtlar:


210

Kullanabilirsiniz

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

Elde ettiğiniz onaltılık basamaklarınızın büyük harfle yazılmasını istiyorsanız ( #FFFFFFvs. #ffffff) büyük X kullanın .


3
Giriş türü 'Color' ile: String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien

Bu sonuçclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82

@ smillien62: Bunun basitleştirilebileceğine inanıyorumString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion, Sözdiziminizle bir uyarınız var çünkü "Tamsayı" yerine "int" kullanıyorsunuz.
Stéphane Millien

47

String.formatTüm RGB renkleri için tek astar olmadan :

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

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

Büyük .toUpperCase()harflere geçmek istiyorsanız bir ekleyebilirsiniz . Bunun tüm RGB renkleri için geçerli olduğunu (soruda sorulduğu gibi) unutmayın.

ARGB renkleriniz olduğunda şunları kullanabilirsiniz:

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

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

Teorik olarak tek astar da mümkündür ancak toHexString'in iki kez çağrılması gerekir. ARGB çözümünü karşılaştırdım ve aşağıdakilerle karşılaştırdım String.format():

görüntü açıklamasını buraya girin


11
Renginiz <16 alfa değerine sahipse (yani onaltılık ARGB gösterimi 0 ile başlıyorsa) bu yöntemin bozulduğunu unutmayın.
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
Bu yanıt, kırmızı veya yeşil değerleri (bir örnek, sıfır olduğu durumda işe yaramamaktadır Color.BLUE, burada çıkış #0ffolarak Color.BLUE sonuçlarının RGB değeri ing '&, çünkü 256bir temel 10, içinde ffhex). Düzeltme, whilesıfırları önceden korurken if ifadesi yerine bir döngü kullanmaktır .
FThompson

1

Bu verdiği cevabın uyarlanmış bir versiyonudur Vivien Barousse gelen güncelleme ile Vulcan uyguladı. Bu örnekte, RGB değerlerini üç kaydırıcıdan dinamik olarak almak ve bu rengi bir dikdörtgen içinde görüntülemek için kaydırıcıları kullanıyorum. Daha sonra toHex () yönteminde değerleri bir renk oluşturmak ve ilgili Hex renk kodunu görüntülemek için kullanıyorum.

Bu örnek, GridBagLayout için uygun kısıtlamaları içermez. Kod çalışacak olsa da ekran tuhaf görünecek.

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

Hem Vivien'e hem de Vulcan'a çok teşekkür ederim. Bu çözüm mükemmel çalışıyor ve uygulaması çok basitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.