Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert from HEX color to RGB struct in C

Tags:

c

hex

colors

rgb

How do you convert from color HEX code to RGB in pure C using C library only (without C++ or templates)? The RGB struct may be like this:

typedef struct RGB {
    double r;
    double g;
     double b;
} RGB1;

The function I'm looking for should return RGB1.

like image 450
Shavkat Avatar asked Sep 16 '10 04:09

Shavkat


3 Answers

An RGB value can be stored as in integer via 0xRRGGBB. Examples:

  • Red: 0xff0000
  • Green: 0x00ff00
  • Blue: 0x0000ff

00 is hex for decimal 0, while ff is 255. 0 corresponds to 0.0 and 255 to 1.0. (Actually you didn't specify what the range is. I'm assuming 0.0 to 1.0.)

So with the above assumptions, you need to extract each component and divide by 255. Since it sounds a lot like a homework question, I'll just show you how you can do the red component.

int hex = 0x123456;
c.r = ((hex >> 16) & 0xff) / 255.0;

Each hex digit takes up 4 bits. So shift to the right by 16 bits (to move everything 4 digits to the right) to make 0xRRGGBB become 0xRR. Now you have the red component. (Just in case there is some data higher up in the integer, you can get rid of it by masking the data via & 0xff.)

If you are dealing with a string "#FFFFFF", then you'd first have to convert it to an integer for the above to work.

like image 104
Matthew Avatar answered Oct 23 '22 16:10

Matthew


If the hex code is a string, you can parse it like this

char *str = "0000FF";
int r, g, b;
sscanf(str, "%02x%02x%02x", &r, &g, &b);

That is to ints, not doubles. Also do check that sscanf returns 3, the number of items read.

like image 39
Tor Klingberg Avatar answered Oct 23 '22 15:10

Tor Klingberg


Assuming that your hex value is a 32-bit 'int' type, and that we use the RGB struct described above, then maybe do something like:

struct RGB colorConverter(int hexValue)
{
  struct RGB rgbColor;
  rgbColor.r = ((hexValue >> 16) & 0xFF) / 255.0;  // Extract the RR byte
  rgbColor.g = ((hexValue >> 8) & 0xFF) / 255.0;   // Extract the GG byte
  rgbColor.b = ((hexValue) & 0xFF) / 255.0;        // Extract the BB byte

  return rgbColor; 
}
like image 33
cubic1271 Avatar answered Oct 23 '22 17:10

cubic1271