162

Working off Jeremy's response here: Converting hex color to RGB and vice-versa I was able to get a python program to convert preset colour hex codes (example #B4FBB8), however from an end-user perspective we can't ask people to edit code & run from there. How can one prompt the user to enter a hex value and then have it spit out a RGB value from there?

Here's the code I have thus far:

def hex_to_rgb(value): value = value.lstrip('#') lv = len(value) return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3)) def rgb_to_hex(rgb): return '#%02x%02x%02x' % rgb hex_to_rgb("#ffffff") # ==> (255, 255, 255) hex_to_rgb("#ffffffffffff") # ==> (65535, 65535, 65535) rgb_to_hex((255, 255, 255)) # ==> '#ffffff' rgb_to_hex((65535, 65535, 65535)) # ==> '#ffffffffffff' print('Please enter your colour hex') hex == input("") print('Calculating...') print(hex_to_rgb(hex())) 

Using the line print(hex_to_rgb('#B4FBB8')) I'm able to get it to spit out the correct RGB value which is (180, 251, 184)

It's probably super simple - I'm still pretty rough with Python.

1

15 Answers 15

276

I believe that this does what you are looking for:

h = input('Enter hex: ').lstrip('#') print('RGB =', tuple(int(h[i:i+2], 16) for i in (0, 2, 4))) 

(The above was written for Python 3)

Sample run:

Enter hex: #B4FBB8 RGB = (180, 251, 184) 

Writing to a file

To write to a file with handle fhandle while preserving the formatting:

fhandle.write('RGB = {}'.format( tuple(int(h[i:i+2], 16) for i in (0, 2, 4)) )) 
Sign up to request clarification or add additional context in comments.

9 Comments

Beautiful. Cuts 23 lines down to two, only suggestion is fixing to for i in (0, 2, 4)))
Question, John1024, I'm writing the result (example #FFFFFF being (255, 255, 255)) to a file using f.write, it requests it be a string rather than a tuple. Is there any way I can convert it to a string preserving the commas and spaces? Cheers :)
@JulianWhite No problem. I updated the answer using string formatting suitable for f.write.
@John1024 Gotcha. When I started out with 2.7.12 I was using print from the future I forgot all about that problem for others.
For convenience, the reverse of this, converting a color triple c back to a hex string, is '#' + ''.join(hex(x)[2:].zfill(2) for x in c).
|
58

You can use ImageColor from Pillow.

>>> from PIL import ImageColor >>> ImageColor.getcolor("#23a9dd", "RGB") (35, 169, 221) 

2 Comments

Hey @SuperNova how to get the name of color instead of pixel values?
hwy @Mvk1312. Please check this. stackoverflow.com/questions/9694165/…
53

Just another option: matplotlib.colors module.

Quite simple:

>>> import matplotlib.colors >>> matplotlib.colors.to_rgb('#B4FBB8') (0.7058823529411765, 0.984313725490196, 0.7215686274509804) 

Note that the input of to_rgb need not to be hexadecimal color format, it admits several color formats.

You can also use the deprecated hex2color

>>> matplotlib.colors.hex2color('#B4FBB8') (0.7058823529411765, 0.984313725490196, 0.7215686274509804) 

The bonus is that we have the inverse function, to_hex and few extra functions such as, rgb_to_hsv.

Comments

19

A lazy option: webcolors package has a hex_to_rgb function.

2 Comments

By the way, currently webcolors does not have a hex_to_rgb where the tuples are specified in decimal value in range 0 and 1 (say hex_to_rgb_decimal). But, you can use this code that imports numpy and webcolors: tuple(numpy.array(webcolors.hex_to_rgb('#9C0006'))/255.0)
This was apparently the only solution that worked for me.
11

PIL also has this function, in ImageColor.

from PIL import ImageColor ImageColor.getrgb("#9b9b9b") 

And if you want the numbers from 0 to 1

[i/256 for i in ImageColor.getrgb("#9b9b9b")] 

2 Comments

In case you need values from 0…1: rgb = [i/256 for i in (ImageColor.getrgb("#9b9b9b"))]
I believe the last comment to be wrong. 255/256=0.99609. The values returned from ImageColor.getrbb are [0 ... 255], hard bounded by 255 upper limit. By dividing 256 you will never reach 1.0. Unless I am very wrong here, I suggest you change this to i/255.
10

Try this:

def rgb_to_hex(rgb): return '%02x%02x%02x' % rgb 

Usage:

>>> rgb_to_hex((255, 255, 195)) 'ffffc3' 

And for the reverse:

def hex_to_rgb(hexa): return tuple(int(hexa[i:i+2], 16) for i in (0, 2, 4)) 

Usage:

>>> hex_to_rgb('ffffc3') (255, 255, 195) 

1 Comment

this is what I was looking for.. might want to handle hex strings with leading #, for example the way John1024 did it... something like hexa = hexa.lstrip('#')
7

The following function will convert hex string to rgb values:

def hex_to_rgb(hex_string): r_hex = hex_string[1:3] g_hex = hex_string[3:5] b_hex = hex_string[5:7] return int(r_hex, 16), int(g_hex, 16), int(b_hex, 16) 

This will convert the hexadecimal_string to decimal number

int(hex_string, 16) 

For example:

int('ff', 16) # Gives 255 in integer data type 

1 Comment

I found this solution is fastest one.
6

This function will return the RGB values in float from a Hex code.

def hextofloats(h): '''Takes a hex rgb string (e.g. #ffffff) and returns an RGB tuple (float, float, float).''' return tuple(int(h[i:i + 2], 16) / 255. for i in (1, 3, 5)) # skip '#' 

This function will return Hex code from RGB value.

def floatstohex(rgb): '''Takes an RGB tuple or list and returns a hex RGB string.''' return f'#{int(rgb[0]*255):02x}{int(rgb[1]*255):02x}{int(rgb[2]*255):02x}' 

1 Comment

floatstohex([255,255,255]) produces '#fe01fe01fe01', should it not be "#FFFFFF"
5

As HEX codes can be like "#FFF", "#000", "#0F0" or even "#ABC" that only use three digits. These are just the shorthand version of writing a code, which are the three pairs of identical digits "#FFFFFF", "#000000", "#00FF00" or "#AABBCC".


This function is made in such a way that it can work with both shorthands as well as the full length of HEX codes. Returns RGB values if the argument hsl = False else return HSL values.

import re def hex_to_rgb(hx, hsl=False): """Converts a HEX code into RGB or HSL. Args: hx (str): Takes both short as well as long HEX codes. hsl (bool): Converts the given HEX code into HSL value if True. Return: Tuple of length 3 consisting of either int or float values. Raise: ValueError: If given value is not a valid HEX code.""" if re.compile(r'#[a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?$').match(hx): div = 255.0 if hsl else 0 if len(hx) <= 4: return tuple(int(hx[i]*2, 16) / div if div else int(hx[i]*2, 16) for i in (1, 2, 3)) return tuple(int(hx[i:i+2], 16) / div if div else int(hx[i:i+2], 16) for i in (1, 3, 5)) raise ValueError(f'"{hx}" is not a valid HEX code.') 

Here are some IDLE outputs.

>>> hex_to_rgb('#FFB6C1') (255, 182, 193) >>> hex_to_rgb('#ABC') (170, 187, 204) >>> hex_to_rgb('#FFB6C1', hsl=True) (1.0, 0.7137254901960784, 0.7568627450980392) >>> hex_to_rgb('#ABC', hsl=True) (0.6666666666666666, 0.7333333333333333, 0.8) >>> hex_to_rgb('#00FFFF') (0, 255, 255) >>> hex_to_rgb('#0FF') (0, 255, 255) >>> hex_to_rgb('#0FFG') # When invalid hex is given. ValueError: "#0FFG" is not a valid HEX code. 

Comments

2

There are two small errors here!

hex == input("") 

Should be:

user_hex = input("") 

You want to assign the output of input() to hex, not check for comparison. Also, as mentioned in comments (@koukouviou) don't override hex, instead call it something like user_hex.

Also:

print(hex_to_rgb(hex())) 

Should be:

print(hex_to_rgb(user_hex)) 

You want to use the value of hex, not the type's callable method (__call__).

2 Comments

It is better to avoid overriding hex. Maybe something like hex_in or similar is better
Good point, @koukouviou - Python reports it as built-in name.
2

All the answers I've seen involve manipulation of a hex string. In my view, I'd prefer to work with encoded integers and RGB triples themselves, not just strings. This has the benefit of not requiring that a color be represented in hexadecimal-- it could be in octal, binary, decimal, what have you.

Converting an RGB triple to an integer is easy.

rgb = (0xc4, 0xfb, 0xa1) # (196, 251, 161) def rgb2int(r,g,b): return (256**2)*r + 256*g + b c = rgb2int(*rgb) # 12909473 print(hex(c)) # '0xc4fba1' 

We need a little more math for the opposite direction. I've lifted the following from my answer to a similar Math exchange question.

c = 0xc4fba1 def int2rgb(n): b = n % 256 g = int( ((n-b)/256) % 256 ) # always an integer r = int( ((n-b)/256**2) - g/256 ) # ditto return (r,g,b) print(tuple(map(hex, int2rgb(c)))) # ('0xc4', '0xfb', '0xa1') 

With this approach, you can convert to and from strings with ease.

2 Comments

Well the question was about hex.
It does not answer the question, but it gives insight into how it's done conceptually, so +1. (teach a man how to fish and so on... )
0

This supports also RGBA converting and short form (#fff). It's pretty ugly, but it does the trick.

 def parse_hex(h): if h[0]=="#": h=h[1:] try: col=int(h,16) except ValueError: raise ValueError("Invalid HEX string") from None l=len(h) if l== 6: #long form , no alpha return (col&0xff0000)>>16,(col&0xff00)>>8,(col&0xff),1 elif l== 8: #long form, alpha scol = col >> 8 return (scol&0xff0000)>>16,(scol&0xff00)>>8,(scol&0xff),(col&0xff)/255 elif l == 3: #short form, no alpha return 17*((col&0xf00)>>8),17*((col&0xf0)>>4),17*(col&0xf),1 elif l == 4: #short form, alpha print(hex(col)) return 17*((col&0xf000)>>12),17*((col&0xf00)>>8),17*((col&0xf0)>>4),17*(col&0xf)/255 else: raise ValueError("Invalid HEX string") 

Comments

0

#Converting Hex to RGB value in Python

def hex_to_rgb(h, opacity=.8): r = g = b = 0 if len(h) == 4: r = int(("0x" + h[1] + h[1]), base=16) g = int(("0x" + h[2] + h[2]), base=16) b = int(("0x" + h[3] + h[3]), base=16) elif len(h) == 7: r = int(("0x" + h[1] + h[2]), base=16) g = int(("0x" + h[3] + h[4]), base=16) b = int(("0x" + h[5] + h[6]), base=16) if opacity: return f"rgb({r}, {g}, {b}, {opacity})" return f"rgb({r}, {g}, {b})" 

Comments

0

This takes the accepted answer, but also handles short form hex codes e.g. #fff, #000 that can be encountered in the wild.

h = input('Enter hex: ').lstrip('#') if len(h == 3): h = ''.join([d + d for d in h]) print('RGB =', tuple(int(h[i:i+2], 16) for i in (0, 2, 4))) 

Comments

0
def RGB2HEX(color): return "#{:02x}{:02x}{:02x}".format(int(color[0]), int(color[1]), int(color[2])) def get_image(image_path): image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) return image IMAGE_DIRECTORY = 'C:/Users/Dell/Desktop/CPS 02' COLORS = { 'GREEN': [0, 128, 0], 'BLUE': [0, 0, 128], 'YELLOW': [255, 255, 0] } images = [] for file in os.listdir(IMAGE_DIRECTORY): if not file.startswith('.'): images.append(get_image(os.path.join(IMAGE_DIRECTORY, file))) # extracting colors from image def get_colors(images, number_of_colors, show_char = True): for j in range(len(images)): modified_image = cv2.resize(images[j], (600, 400), interpolation = cv2.INTER_AREA) modified_image = modified_image.reshape(modified_image.shape[0]*modified_image.shape[1],1) clf = KMeans(n_clusters = number_of_colors) labels = clf.fit_predict(modified_image) counts = Counter(labels) center_colors = clf.cluster_centers_ # We get ordered colors by iterating through the keys ordered_colors = [center_colors[i] for i in counts.keys()] hex_colors = [RGB2HEX(ordered_colors[i]) for i in counts.keys()] rgb_colors = [ordered_colors[i] for i in counts.keys()] # matching an image by its color def match_image_by_color(image, color, threshold = 60, number_of_colors = 10): image_colors = get_colors(image, number_of_colors, False) selected_color = rgb2lab(np.uint8(np.asarray([[color]]))) select_image = False for i in range(number_of_colors): curr_color = rgb2lab(np.uint8(np.asarray([[image_colors[i]]]))) diff = deltaE_cie76(selected_color, curr_color) if (diff < threshold): select_image = True return select_image # Selecting an image def show_selected_images(images, color, threshold, colors_to_match): index = 1 for i in range(len(images)): selected = match_image_by_color(images[i], color, threshold, colors_to_match) if (selected): plt.subplot(1, 5, index) plt.imshow(images[i]) index += 1 # printing the result plt.figure(figsize = (20, 10)) show_selected_images(images, COLORS['BLUE'], 60, 5) https://stackoverflow.com/questions 

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.