less_retarded_wiki/rgb565.md

33 lines
1.9 KiB
Markdown
Raw Normal View History

2023-07-25 20:55:42 +02:00
# RGB565
2024-07-30 22:52:22 +02:00
RGB565 is color format, or a way of representing [colors](color.md) with just 2 [bytes](byte.md) (unlike traditional 24 bit RGB formats that use 3 bytes, one for each component), that is 16 [bits](bit.md) (giving a total of 65536 distinct colors), by using 5 bits (highest) for red, 6 bits for green (to which human eye is most sensitive) and 5 bits for blue; it can also be seen as a color [palette](palette.md). It is similar to [rgb332](rgb332.md) -- it's basically a mid way between RGB332 and full 24bit RGB against which it saves one byte per pixel, but compared to RGB332 [byte sex](byte_sex.md) comes to play here. Practically speaking you will rarely need anything more than this, 65 thousand colors are absolutely sufficient for everything.
Yet another similar format to this one is [RGB555](rgb555.md) which sacrifices one useful bit for gaining the nice property of having the same size of each component.
Here is a [C](c.md) code for the basic conversions to/from this format:
```
unsigned int rgbTo565(unsigned char red, unsigned char green,
unsigned char blue)
{
return (((unsigned int) (red / 8)) << 11) |
(((unsigned int) (green / 4)) << 5) | (blue / 8);
}
void rgbFrom565(unsigned int colorIndex, unsigned char *red,
unsigned char *green, unsigned char *blue)
{
unsigned char value = colorIndex >> 11;
*red = value != 31 ? value * 8 : 255;
value = (colorIndex >> 5) & 0x3f;
*green = value != 63 ? value * 4 : 255;
value = colorIndex & 0x1f;
*blue = value != 31 ? value * 8 : 255;
}
```
There exist nice tricks you can do with colors represented this way, like quickly divide all three R, G and B components by a power of two just by doing one bit shift and logical [AND](and.md) to zero the highest bits of the components, or approximating addition of colors with logical [OR](or.md) and so on -- for details see the article on [RGB332](rgb332.md).
2023-07-25 20:55:42 +02:00