Hi

im in a bit of a pickle :S this is probably a lot easier than i imagine. i am a undergrad working on robotics and the robot im working on takes pictures in RGB565 which is 16 bit. but i dont know how that works :/

i understrand 24 bit where red green and blue have a byte each but you cant divide 16 into 3 equal part... so i read more and found that the color is in format RRRRRGGGGGGBBBBB (which is 16 bits) but its odd that green has a bigger range than the other two.

can someone tell me how to read color from this?

any help would be great. thanks in advanced :D

Recommended Answers

All 7 Replies

B = value & 0x1f
G = (value >> 5) & 0x3f
R = (value >> 11) & 0x1f

so for example if i wanted the reddest thing would i do:

if (R > G && R > B){LED = 1;}else{LED = 0;}

Just a little more background information on why the number of green bits is larger than the other two:
(Excerpt from Programming Windows, Fifth Edition by Charles Petzold (c) 1998, Chapter 14, "Bitmap Dimensions")
<snip>
In recent years, full-color video adapter boards have become quite common. These use either 16 bits or 24 bits per pixel. Sometimes with 16 bits per pixel, one bit is unused and the other 15 bits are apportioned equally for the red, green, and blue primaries. This allows a total of 32,768 colors with combinations of 32 shades each of red, green, and blue. More commonly, 6 bits are used for green (the color that humans are most sensitive to) and 65,536 colors are available. For the nontechnical PC user who doesn't want to see wacky numbers like 32,768 or 65,536, such video display boards are usually said to be "high color" adapters that provide "thousands of colors."
</snip>
(bold and color are my addition)
If you want an excellent and exhaustive presentation of Device-Independent bitmaps and Device-Dependent bitmaps (and how to program for them under Windows) I recommend you borrow or buy a copy of that book and pay special attention to Chapter 15. All the examples are in C language, but the techniques are translatable to other languages without too much trouble.

@Momerath what value is actually stored in R,G and B (how do i compare values?) it compiles fine if i make them int or char.

this is my code:

int R,B,G;
	
	while(1)
	{
		launch_capture(buffer);
		while(!img_ready());
		
		for(i=0; i<100; i++)
		{
			
			B = (buffer[50] + buffer[50+1]) & 0x1f;
			G = ((buffer[50] + buffer[50+1]) >> 5) & 0x3f;
			R = ((buffer[50] + buffer[50+1]) >> 11) & 0x1f ;
			
			if (R > 100){lighton();}else{lightoff();}
			
		}
	}

any help would be helpful :)

R is the amount of Red in the color. It ranges from 0 to 31.
G is the amount of Green in the color. It ranges from 0 to 63.
B is the amount of Blue in the color. It ranges from 0 to 31.

(0,0,0) is black, (31, 63, 31) is white.

so for example if i wanted the reddest thing would i do:

<SPAM REMOVED>

so for example if i wanted the reddest thing would i do:

You'd need to define what you mean by 'reddest'. For example, let's say we have to RGB colors with the values (31,1,0) and (30,0,0). Which is 'redder'? The first has a higher red value, but has a tiny amount of green. The second doesn't have the full red value, but has no other colors in it.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.