Color palettes

From TheAlmightyGuru
Revision as of 11:04, 21 January 2019 by TheAlmightyGuru (talk | contribs) (VGA Palette)
Jump to: navigation, search

A color palette in computing terms is a lookup of colors that a display system can use. This can either refer to the complete color set it can use, or just the color set it can use at a time, or in a certain area on the screen. Modern computers have a palette in the billions of colors, but in the early days of computing, color palettes were far more limited.

True Color, 24-bit 16,777,216 Colors

256 - Red, 256 - Green, 256 - Blue.

So-called "true color" is a 24-bit RGB color system which uses a full byte (8-bits) for each red, green, and blue intensity resulting in 16,777,216 possible colors. Here is an example of a photo utilizing 24-bit color.

Color Palette - RGB - Test.png

High Color, 16-bit 65,536 Colors

32 - Red, 64 - Green, 32 - Blue.

So-called "high color" is a 16-bit RGB color system which uses 2 bytes to describe each color in the palette, yielding 65,536 unique colors. This is usually setup using 5 bits for red intensity, 6 for green intensity, and 5 for blue intensity, or 32 shades of red and blue, but 64 shades of green. Some systems use 5 for each intensity for simplicity sake, and are technically only 15-bit.

Few graphic formats support 16-bit color, but it was a very large step up from 8-bit palettes because it results in enough colors to display photographs of decent quality while still being one full byte smaller in size per pixel than 24-bit color. Notice how the example below looks nearly identical to the 24-bit color original. It's only when you zoom in that you begin to see the quality loss.

Color Palette - 16-Bit Color - Example.png

Indexed Palettes

Indexed palettes are those which have a predefined set of colors. These became especially popular during the VGA era of digital art.

VGA Palette

Default VGA palette.

The default Video Graphics Array color palette was designed to be backward-compatible with both the CGA and EGA palettes, so the first 16 colors match, while also expanding the total number of colors to 256. There are 16 shades of gray, and then three color spectra, each with three levels of saturation, at three different shades. There are also 8 indexes at the end left black, though I'm not sure why.

Although this is the default color set, the palette was customizable with each index being made up of red, green, and blue intensities ranging from 0-63. It was common for games developed for the VGA platform to have palette files among their resources which would be exactly 768 bytes in size which was enough bytes to define an RGB intensity for each index.

Color Palette - 8-Bit Color (VGA) - Example.png

Single-Byte Palettes

A single-byte palette is one that can be defined using eight or fewer bits rather than a lookup table. Single byte color palettes were popular in the early days of computing when memory was at a premium and palette lookup tables were memory intensive. There are many different algorithms used to encode an entire color palette into a single byte and quickly get the results.

R1-G1-B1, 3-bit, 8 Colors

1 - Red, 1 - Green, 1 - Blue.

RGB 3-bit uses one bit for each red, green, and blue value which allows for two intensities per value yielding eight colors total. To get each RGB value simply multiply its bit by 255. This is the smallest possible palette that can include red, green, and blue simultaneously.

This palette was mostly ignored in the USA, but it was used by the European ZX Spectrum and several early Japanese home computers like the Sharp X-1 and PC-8801. Graphic displays which use binary LEDs use a system similar to this where a series of red, green, and blue LED are placed next to each other in tandem, and are turned on or off to simulate other colors when viewed at a distance, though they do not have separate values for composites like cyan, yellow, magenta, and white.

Such a limited color palette produces especially grainy results with real-life photos.

Color Palette - 3-Bit Color (1-1-1) - Example.png

R4-G4-B4, 6-bit, 64 Colors

4 - Red, 4 - Green, 4 - Blue.

RGB 6-bit uses two bits for each red, green, and blue value which allows for four intensities per value yielding 64 colors total. The Enhanced Graphics Adapter uses this system to represent all of the possible colors of which it can use 16 at a time. In computer systems with 8-bit bytes, this color system isn't very compact because it leaves two unused bits per byte, although, the unused bits could be used to store additional information. On a computer architecture which uses 12-bit bytes, two colors can be stored in a single byte. With 8-times the number of colors compared to 3-bit color, the output photo is much nicer looking.

Color Palette - 6-Bit Color (4-4-4) - Example.png

R6-G6-B6, 8-bit, 216 Colors

6 - Red, 6 - Green, 6 - Blue.

Because RGB color has three unique values, it can't be stored into single 8-bit byte evenly while also using all the indexes. This has led to various algorithms being devised to get an optimal palette. The 6-6-6 method yields the largest number of colors possible while still having an equal number of intensities for each value. This layout uses all 8-bits, but the red, green, and blue values are determined with the following algorithm: (36×R)+(6×G)+B. This allows for six intensities per value yielding 216 colors total. The remaining 40 indexes are left unused and could be filled from a color table. While this makes it slightly more CPU intensive to extract a color from the palette, it does have the advantage of being perfectly uniform across each value. In fact, this color system was used by early Web browsers as their "Web-safe" color set. Naturally, the added colors make the end result more attractive.

Color Palette - 8-Bit Color (6-6-6) - Example.png

R6-G7-B6, 8-bit, 252 Colors

6 - Red, 7 - Green, 6 - Blue.

Because the human eye is better at resolving green than red or blue, one of the more optimal palette generation algorithms is add emphasis to green. This 6-7-6 algorithm also uses all eight bits, but adds an extra intensity level for green with the algorithm (42×R)+(6×G)+B. This allows for seven intensities of green and two of red and blue yielding 252 colors total. Like 6-6-6, this is more CPU intensive, but by adding an additional 36 colors, it results in a better output.

Color Palette - 8-Bit Color (8-8-4) - Example.png

R6-G8-B5, 8-bit, 240 Colors

6 - Red, 8 - Green, 5 - Blue.

This configuration is made because the human eye is actually a lot better at resolving green than blue, but it's also better at resolving red. So, this 6-8-5 gives one intensity level of blue to green. The algorithm uses all eight bits and can be represented at (40×R)+(5×G)+B. This allows for six intensities of red, eight of green, and only five of blue, yielding 240 colors total. Like 6-6-6, it's also more CPU intensive, but by putting more emphasis on green at the cost of blue, it can actually yield better results for a human viewer, despite the lost colors.

Color Palette - 8-Bit Color (6-8-5) - Example.png

R8-G8-B4, 8-bit, 256 Colors

8 - Red, 8 - Green, 4 - Blue.

This 8-bit configuration uses three bits for each red and green value, but only two bits for blue. This allows for eight intensities for red and green, and four for blue, yielding 256 colors. This layout is good for human viewing and yields the maximum amount of colors. While the palette might not be as versatile as a 6-7-6 or 6-8-5, it is far less CPU intensive because each value is stored in its own bit space. A palette of this type was used by early Namco arcade games like Pac-Man.

Color Palette - 8-Bit Color (8-8-4) - Example.png

R8-G4-B8, 8-bit, 256 Colors

8 - Red, 4 - Green, 8 - Blue.

To give you an idea of why green is the focus in all of the non-homogeneous palettes above, here is an algorithm similar to 8-8-4, but with the least emphasis on green. This system uses three bits for red and blue, and only two for green. This results in eight levels of intensity for red and blue, but only four for green, yielding 256 colors. Despite having four times the colors, the output isn't much better than the 64-color 3-3-3 output from above. Green is extremely important.

Color Palette - 8-Bit Color (8-4-8) - Example.png

R4-G8-B8, 8-bit, 256 Colors

4 - Red, 8 - Green, 8 - Blue.

This is like the 8-8-4, but with emphasis added to blue and green over red. This system uses two bits for red, and three for green and blue. This results in four levels of intensity for red, but eight for green and blue, yielding 256 colors. Notice how the output paradoxically looks more red despite having less red intensity. The warmer tone comes from the loss of nuance in red.

Color Palette - 8-Bit Color (4-8-8) - Example.png