Reputation: 10799
Following from this answer, I am generating some evenly spaced colors in Python as follows:
>>> import colorsys
>>> num_colors = 22
>>> hsv_tuples = [(x*1.0/num_colors, 0.5, 0.5) for x in range(num_colors)]
>>> rgb_tuples = map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples)
>>> rgb_tuples
[(0.5, 0.25, 0.25), (0.5, 0.3181818181818182, 0.25), (0.5, 0.38636363636363635, 0.25), (0.5, 0.45454545454545453, 0.25), (0.4772727272727273, 0.5, 0.25), (0.4090909090909091, 0.5, 0.25), (0.34090909090909094, 0.5, 0.25), (0.2727272727272727, 0.5, 0.25), (0.25, 0.5, 0.2954545454545454), (0.25, 0.5, 0.36363636363636365), (0.25, 0.5, 0.43181818181818177), (0.25, 0.5, 0.5), (0.25, 0.4318181818181819, 0.5), (0.25, 0.36363636363636354, 0.5), (0.25, 0.2954545454545454, 0.5), (0.2727272727272727, 0.25, 0.5), (0.34090909090909083, 0.25, 0.5), (0.40909090909090917, 0.25, 0.5), (0.4772727272727273, 0.25, 0.5), (0.5, 0.25, 0.4545454545454546), (0.5, 0.25, 0.38636363636363646), (0.5, 0.25, 0.3181818181818181)]
Hows does one now convert from these ("coordinate?") RGB tuples back to RGB hex strings, e.g. #FF00AA
? Probably a simple question, but not one I've been able to find the answer to.
Upvotes: 6
Views: 7848
Reputation:
The most affective way to do this is to convert the base-1 decimal RGBs into the base-16 decimal, or HEX.
r = int(input('R: '))
g = int(input('G: '))
b = int(input('B: '))
def rgbToHex(r,g,b):
rgb = [r,g,b]
x = ''
for i in rgb:
x += format(i,'02x').upper()
if x[0] == x[1] and x[2] == x[3] and x[4] == x[5]:
x = x[0] + x[2] + x[4]
return '#'+x
print(rgbToHex(r,g,b))
Upvotes: 0
Reputation: 14619
For each color, floor(color * 256), printed out in hexadecimal (padded to 2 places). e.g.:
In [1]: rgb_tuples = [(0.5, 0.25, 0.25), (0.5, 0.3181818181818182, 0.25), (0.5, 0.38636363636363635, 0.25), (0.5, 0.45454545454545453, 0.25), (0.4772727272727273, 0.5, 0.25), (0.4090909090909091, 0.5, 0.25), (0.34090909090909094, 0.5, 0.25), (0.2727272727272727, 0.5, 0.25), (0.25, 0.5, 0.2954545454545454), (0.25, 0.5, 0.36363636363636365), (0.25, 0.5, 0.43181818181818177), (0.25, 0.5, 0.5), (0.25, 0.4318181818181819, 0.5), (0.25, 0.36363636363636354, 0.5), (0.25, 0.2954545454545454, 0.5), (0.2727272727272727, 0.25, 0.5), (0.34090909090909083, 0.25, 0.5), (0.40909090909090917, 0.25, 0.5), (0.4772727272727273, 0.25, 0.5), (0.5, 0.25, 0.4545454545454546), (0.5, 0.25, 0.38636363636363646), (0.5, 0.25, 0.3181818181818181)]
In [2]: for (r,g,b) in rgb_tuples:
...: print '%02x%02x%02x' % (int(r*255), int(g*255), int(b*255))
...:
804040
805140
806240
807440
Upvotes: 8
Reputation: 21773
1) Multiply the float by 256 and convert to an integer. If it's equal to 256, subtract 1.
EDIT: Since I'm getting a lot of confused comments, the reason why you have to multiply by 256 (subtract 1 if it ends up at 256) is so you get exactly the same number of float values corresponding to each integer output.
'x' Hex format. Outputs the number in base 16, using lower- case letters for the digits above 9.
Use that, make it upper case and plunk a # before it.
Upvotes: 4