I wrote this to better understand the relationship between RGB colors. Running it will generate a fairly large HTML file with all sorts of color transitions on it so you can see what is happening as colors are tweaked in different ways.
import string
colors = ("00", "33", "66", "99", "CC", "FF")
masks = ("#00~00", "#~~00", "#~0000", "#~00~", "#0000~", "#00~~", "#FF~00", "#~~~")
f = open("colortest-gradation.html", 'w')
f.write("<html><head><title>RGB Gradation</title></head><body bgcolor='black'><tt><b>")
f.write("<p><font color='white'>Gentle gradations through RGB color:</font></p>\n")
bytes = ("00", "11", "22", "33", "44", "55", "66", "77", "88", "99", "AA", "BB", "CC", "DD", "EE", "FF")
halfbytes = ("00", "00", "11", "11", "22", "22", "33", "33", "44", "44", "55", "55", "66", "66", "77", "77")
for green in bytes:
f.write( "<li>" )
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
f.write( "<font color='" + c1 + "'>" )
f.write( "T")
f.write( "</font>")
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
f.write( "<font color='" + c2 + "'>" )
f.write( "T")
f.write( "</font>")
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
f.write( "<font color='" + c3 + "'>" )
f.write( "T")
f.write( "</font>")
f.write( "</li>\n" )
f.write("<p><font color='white'>Double all bytes to get real color (#0A0 --> #00AA00 etc)</font></p>\n")
f.write("<p><font color='white'>Green varied alone, Red/Blue varied together:</font></p>\n")
for green in bytes:
f.write( "<li>" )
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
cout = "#" + c1[1] + c1[3] + c1[5] + " "
f.write( "<font color='" + c1 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
f.write("<p><font color='white'>Blue varied alone, Red/Green varied together:</font></p>\n")
for green in bytes:
f.write( "<li>" )
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
cout = "#" + c2[1] + c2[3] + c2[5] + " "
f.write( "<font color='" + c2 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
f.write("<p><font color='white'>Red varied alone, Green/Blue varied together:</font></p>\n")
for green in bytes:
f.write( "<li>" )
for white in bytes:
c1 = "#" + white + green + white
c2 = "#" + white + white + green
c3 = "#" + green + white + white
cout = "#" + c3[1] + c3[3] + c3[5] + " "
f.write( "<font color='" + c3 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
for red in bytes:
f.write("<p><font color='white'>Red locked at " + red + ", other colors varied:</font></p>\n")
for green in halfbytes:
f.write( "<li>\n")
for blue in halfbytes:
c3 = "#" + red + green + "00"
cout = "#" + c3[1] + c3[3] + c3[5] + " "
f.write( "<font color='" + c3 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
for green in bytes:
f.write("<p><font color='white'>Green locked at " + green + ", other colors varied:</font></p>\n")
for red in bytes:
f.write( "<li>\n")
for blue in bytes:
c3 = "#" + red + green + blue
cout = "#" + c3[1] + c3[3] + c3[5] + " "
f.write( "<font color='" + c3 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
for blue in bytes:
f.write("<p><font color='white'>Blue locked at " + blue + ", other colors varied:</font></p>\n")
for green in bytes:
f.write( "<li>\n")
for red in bytes:
c3 = "#" + red + green + blue
cout = "#" + c3[1] + c3[3] + c3[5] + " "
f.write( "<font color='" + c3 + "'>" )
f.write( cout)
f.write( "</font>")
f.write( "</li>\n" )
f.write("</b></tt></body></html>")
f.close()