Konvertieren Sie einen RGB-Farbwert in eine hexadezimale Zeichenfolge

Lesezeit: 6 Minuten

Benutzer-Avatar
Lachhand

In meiner Java-Anwendung konnte ich die abrufen Color von a JButton in Rot, Grün und Blau; Ich habe diese Werte in drei gespeichert ints.

Wie konvertiere ich diese RGB-Werte in a String mit der äquivalenten hexadezimalen Darstellung? Wie zum Beispiel #0033fA

Benutzer-Avatar
mhshams

Sie können verwenden

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

Verwenden Sie große X, wenn Sie möchten, dass Ihre resultierenden Hex-Ziffern groß geschrieben werden (#FFFFFF vs. #ffffff).

  • Bei Eingabetyp ‘Color’: String.format(“#%06x”, Integer.valueOf(color.getRGB() & 0x00FFFFFF));

    – Stéphane Millien

    12. Februar 2020 um 18:21 Uhr

  • Das führt zu class java.util.IllegalFormatConversionException with message: x != java.lang.Float

    – Mig82

    15. Juni 2020 um 19:14 Uhr

  • @ smillien62: Ich glaube, das kann vereinfacht werden String.format("#%06x", color.getRGB() & 0xFFFFFF);

    – MestreLion

    10. Juli 2020 um 7:50 Uhr

  • @MestreLion, Mit Ihrer Syntax haben Sie eine Warnung, weil Sie ein “int” anstelle eines “Integer” verwenden.

    – Stéphane Millien

    10. Juli 2020 um 10:25 Uhr

Benutzer-Avatar
Lonzak

Ein Einzeiler, aber ohne String.format für alle RGB Farben:

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

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

Sie können eine hinzufügen .toUpperCase()wenn Sie zu Großbuchstaben wechseln möchten. Beachten Sie, dass dies (wie in der Frage gefragt) für alle RGB-Farben gilt.

Wenn du. .. hast ARGB Farben, die Sie verwenden können:

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

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

Ein Einzeiler ist theoretisch auch möglich, müsste aber zweimal toHexString aufrufen. Ich habe die ARGB-Lösung einem Benchmarking unterzogen und damit verglichen String.format() und die toHexString Lösung hat eine viel höhere Leistung:

Geben Sie hier die Bildbeschreibung ein

  • Beachten Sie, dass diese Methode nicht funktioniert, wenn Ihre Farbe einen Alphawert < 16 hat (dh ihre hexadezimale ARGB-Darstellung beginnt mit 0).

    – ARRG

    4. September 2014 um 15:34 Uhr

Benutzer-Avatar
Vivien Barousse

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;

  • Diese Antwort schlägt fehl, wenn die roten oder grünen Werte Null sind (ein Beispiel ist Color.BLUEdie ausgibt #0ff weil &’ing den RGB-Wert von Color.BLUE ergibt 256 in Basis 10, das heißt ff in Hex). Eine Lösung ist die Verwendung von a while Schleife anstelle einer if-Anweisung, wenn Nullen vorangestellt werden.

    – FThompson

    19. Mai 2015 um 8:14 Uhr


Konvertiere ein java.awt.Color in eine 24-Bit-Hexadezimal-RGB-Darstellung, auch wenn der Alphakanalwert Null ist (z 0000ff):

String.format("%06x", 0xFFFFFF & Color.BLUE.getRGB())

Für Großbuchstaben (zB 0000FF) :

String.format("%06X", 0xFFFFFF & Color.BLUE.getRGB())

Benutzer-Avatar
AlissaFox

Dies ist eine angepasste Version der Antwort von Vivien Barousse mit dem angewendeten Update von Vulcan. In diesem Beispiel verwende ich Schieberegler, um die RGB-Werte von drei Schiebereglern dynamisch abzurufen und diese Farbe in einem Rechteck anzuzeigen. Dann verwende ich in der Methode toHex() die Werte, um eine Farbe zu erstellen und den jeweiligen Hex-Farbcode anzuzeigen.

Dieses Beispiel enthält nicht die richtigen Einschränkungen für das GridBagLayout. Obwohl der Code funktioniert, sieht die Anzeige seltsam aus.

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

Ein riesiges Dankeschön an Vivien und Vulcan. Diese Lösung funktioniert einwandfrei und war super einfach zu implementieren.

leicht modifizierte Versionen für RGBA von How to convert a color integer to a hex String in Android? und wie man RGB in Hex kodiert und dekodiert

    public static String ColorToHex (Color color) {
    int red = color.getRed();
    int green = color.getGreen();
    int blue = color.getBlue();
    int alpha = color.getAlpha(); 

    String redHex = To00Hex(red);
    String greenHex = To00Hex(green);
    String blueHex = To00Hex(blue);
    String alphaHex = To00Hex(alpha);

    // hexBinary value: RRGGBBAA
    StringBuilder str = new StringBuilder("#");
    str.append(redHex);
    str.append(greenHex);
    str.append(blueHex);
    str.append(alphaHex);

    return str.toString();
}

private static String To00Hex(int value) {
    String hex = "00".concat(Integer.toHexString(value));
    hex=hex.toUpperCase();
    return hex.substring(hex.length()-2, hex.length());
} 

Auf andere Weise könnte dieser mit dem obigen Benchmark zusammenhängen:

public static String rgbToHex (Color color) {

   String hex = String.format("#%02x%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha() );
   hex=hex.toUpperCase();
       return hex;
}

Ein sehr einfacher Benchmark zeigt, dass die Lösung mit String.format bei 10 Millionen Farbkonvertierungen mehr als 2-mal langsamer ist als StringBuilder. Bei einer kleinen Anzahl von Objekten kann man keinen wirklichen Unterschied erkennen.

Ich bin kein Experte, daher ist meine Meinung subjektiv. Ich poste den Benchmark-Code für jede Verwendung, ersetzen Sie die Methoden rgbToHex, rgbToHex2 durch diejenigen, die Sie testen möchten:

   public static void benchmark /*ColorToHex*/ () {
       
 Color color = new Color(12,12,12,12);
   
     ArrayList<Color> colorlist = new ArrayList<Color>();
    // a list filled with a color i times
    for (int i = 0; i < 10000000; i++) {
      
        colorlist.add((color));
    }
   
   ArrayList<String> hexlist = new ArrayList<String>();
   System.out.println("START TIME... " + ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME) + "  TEST CASE 1...");
        for (int i = 0; i < colorlist.size(); i++) {
        hexlist.add(rgbToHex(colorlist.get(i)));
    }
        System.out.println("END TIME... " + ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME) + "  TEST CASE 1...");
        System.out.println("hexlist.get(0)... "+hexlist.get(0));
        
     ArrayList<String> hexlist2 = new ArrayList<String>();
   System.out.println("START TIME... " + ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME) + " TEST CASE 2...");
        for (int i = 0; i < colorlist.size(); i++) {
        hexlist2.add(rgbToHex1(colorlist.get(i)));
    }
     System.out.println("END TIME... " + ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME) + "  TEST CASE 2..."); 
     System.out.println("hexlist2.get(0)... "+hexlist2.get(0));

    }

es scheint, dass es Probleme mit gibt Integer.toHexString(color.getRGB())
versuch es mal mit Color color = new Color(0,0,0,0); und Sie werden feststellen, dass wir eine Subtraktion von Nullen haben. #0 statt #00000000 und wir brauchen alle Ziffern, um gültige Hex-Farbwerte zu haben, 6 oder 8 bei Alpha. Soweit ich sehen kann, brauchen wir eine verbesserte Verwendung von Integer.toHexString, um diese Fälle zu handhaben. Es sollte andere Fälle geben, die führende Nullen bei Hex-Werten nicht verarbeiten können. Versuchen Sie es zum Beispiel mit #0c0c0c0c das entspricht Color color = new Color(12,12,12,12); Das Ergebnis ist #C0C0C0C, was falsch ist.

1282070cookie-checkKonvertieren Sie einen RGB-Farbwert in eine hexadezimale Zeichenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy