Alex
Alex

Reputation: 145

Java - Decimal color to RGB color

I have a decimal (not hexadecimal) color code and, using Java, I need to convert it to the three RGB colors.

So for example, 16777215 (pure white) needs to get converted to Red: 255 Green: 255 Blue: 255.
65280 (pure green) needs to get converted to Red: 0 Green 255: Blue: 0

Here is a converter for more examples.


Just doing some small calculations and playing with the calculator on the page linked above, I have determined:

I can tell it obviously has something to do with bytes, but I am missing that last little bit. I am not the best with the whole concept of bits/bytes/etc and how it interacts with Java, so it is likely fairly simple.

So, anyone know the best way of going about this? What would be the best way to convert a single numerical decimal color into the three separate RGB values using java?

Upvotes: 5

Views: 15489

Answers (5)

Spice
Spice

Reputation: 256

I know I am a bit late, but...

int r = color / 65536;
int g = (color - r * 65536) / 256;
int b = color - r * 65536 - g * 256;

This is really doing the exact same thing as the binary shifts even though it doesn't use bitwise operators. This also only works when using valid RGB values (meaning each value is an integer between 0 and 255). For efficiency, however, I would use the binary shifts from the above answers.

Upvotes: 0

Reimeus
Reimeus

Reputation: 159754

You could do

Color color = new Color(16777215);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();

Upvotes: 7

Has QUIT--Anony-Mousse
Has QUIT--Anony-Mousse

Reputation: 77454

Decimal, hexadecimal: does not matter. Your computer uses binary representations internally.

You may have noticed that 0xFF00 == 65280.

Decimal and Hexadecimal are user representations.

Upvotes: 1

Bert Peters
Bert Peters

Reputation: 1542

You can get the channels out by simple bitwise operations.

int r = (color >> 16) & 0xff;
int g = (color >> 8)  & 0xff;
int b = color & 0xff;

From there, it should be easy to do whatever you want with the color information.

Upvotes: 1

Stefano Sanfilippo
Stefano Sanfilippo

Reputation: 33046

You where telling right: RGB values are encoded as bytes in a int. R is byte 2, G is byte 1 and B is byte 0, summing up to a 24bit color depth. Depending on the endianess, this could be a possible representation.

00000000 00000000 00000000 00000000  <-- 32bit int
         ^             ^      ^
         |             |      |
         +--red here   |      +--green here
              8bit     |            8bit
                       |
                       +--blue here
                             8bit

You can extract RGB values with some bit shift and masking:

int red = (color >> 16) & 0xff;
int green = (color >> 8) & 0xff;
int blue = color & 0xff;

Upvotes: 16

Related Questions