Converting RGB to HEX in Java

Java's java.awt.Color is a very handy utility class for dealing with colours. It basically allows you to have an object representation for any colour in the sRGB colour model.

I was recently working on a bug in OperaDriver that the WebElement.getCssValue("background-color") method call returned an RGB value instead of a HEX value in Opera. According to the WebDriver specification, getCssValue():

Get the value of a given CSS property. This is probably not going to return what you expect it to unless you've already had a look at the element using something like firebug. Seriously, even then you'll be lucky for this to work cross-browser. Colour values should be returned as hex strings, so, for example if the "background-color" property is set as "green" in the HTML source, the returned value will be "#008000"

… which frankly to me seems like a very silly thing to do. Although most can, many colours cannot be represented within a #AABBCC HEX range. Think about RGBa from CSS 3 that introduced alpha transparency support. Now, Opera returns RGB or RGBa as standard which to me seems like a much better approach compared to the lossy format HEX.

Anyways, rant aside. I had to convert our perfectly good values from RGB to HEX. This turned out to be a bit tricky using the java.awt.Color interface. It does support converting from HEX to RGB using the Color.decode() method, but not the other way around.

I spent a good hour on implementing a method for converting from RGB to HEX, and I hope you find it useful:


package com.opera.core.systems.model;

import java.awt.Color;

public class OperaColor extends Color {

  public OperaColor(int r, int g, int b) {
    super(r,g,b);
  }

  /**
   * Returns the HEX value representing the colour in the default sRGB ColorModel.
   *
   * @return the HEX value of the colour in the default sRGB ColorModel
   */
  public String getHex() {
    return toHex(getRed(), getGreen(), getBlue());
  }

  /**
   * Returns a web browser-friendly HEX value representing the colour in the default sRGB
   * ColorModel.
   *
   * @param r red
   * @param g green
   * @param b blue
   * @return a browser-friendly HEX value
   */
  public static String toHex(int r, int g, int b) {
    return "#" + toBrowserHexValue(r) + toBrowserHexValue(g) + toBrowserHexValue(b);
  }

  private static String toBrowserHexValue(int number) {
    StringBuilder builder = new StringBuilder(Integer.toHexString(number & 0xff));
    while (builder.length() < 2) {
      builder.append("0");
    }
    return builder.toString().toUpperCase();
  }

}

The toHex(r,g,b) method is static is callable from anywhere. This is utilized by getHex() if calling it on an instantiated object. To use the static method:


OperaColor.toHex(100,255,96);

… will yield "#64FF60".

To use the object-oriented way:


OperaColor color = new OperaColor(100,255,96);
color.getHex();

This is used in OperaColor inside of OperaDriver.