पाइथन में आरजीबी कलर टुपल को छह अंकों के कोड में बदलना


87

मुझे इस # 008040 की तरह कुछ (0, 128, 64) को बदलने की आवश्यकता है। मुझे यकीन नहीं है कि बाद में कॉल करना मुश्किल है, जिससे खोज मुश्किल हो जाती है।


पहले के एसओ का जवाब देखें stackoverflow.com/questions/214359/… - तीन जवाबों के साथ, सबसे अधिक वोट वाले व्यक्ति के पास एक स्टैंड-ए-पीथॉन कोड स्निपेट शामिल है जो मुझे विश्वास है कि आप के बाद हैं।
dgg

3
आप जिस शब्द की तलाश कर रहे हैं वह हेक्स ट्रिपल है। en.wikipedia.org/wiki/Hex_color#Hex_triplet
मार्क रैनसम

अधिक सामान्य प्रश्न के लिए, यहां से बेहतर उत्तर के साथ: stackoverflow.com/a/57197866/624066
MestreLion

जवाबों:


183

प्रारूप ऑपरेटर का उपयोग करें %:

>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'

ध्यान दें कि यह सीमा की जाँच नहीं करेगा ...

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'

हालांकि 2-अंकीय सीमा वास्तव में आवश्यक है? जब तक RGB मान 0-255 के उचित सीमा में हैं, तब तक आपको इसकी आवश्यकता नहीं होनी चाहिए। तो तुम बस कर सकते हैं'#%x%x%x' % (r, g, b)
शब्दों

3
वास्तव में अब मैं देखता हूं कि यदि आपके पास 0 का मान है, तो इसे अन्य 0. के साथ गद्देदार करने की आवश्यकता है। इस प्रकार इसे दो अंक बनाने के लिए 02।
वर्डफेयर वाइज

51
def clamp(x): 
  return max(0, min(x, 255))

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))

यह स्ट्रिंग प्रारूपण की पसंदीदा विधि का उपयोग करता है, जैसा कि पीईपी 3101 में वर्णित है । यह भी उपयोग करता है min()औरmax यह सुनिश्चित करने के लिए 0 <= {r,g,b} <= 255

अपडेट करेंनीचे दिए गए सुझाव के अनुसार ने क्लैंप फ़ंक्शन को जोड़ा।

अद्यतन सवाल और दिए गए संदर्भ के शीर्षक से, यह स्पष्ट होना चाहिए कि यह [0,255] में 3 ints की उम्मीद करता है और हमेशा 3 ऐसे ints पारित होने पर एक रंग वापस करेगा। हालाँकि, टिप्पणियों से, यह सभी के लिए स्पष्ट नहीं हो सकता है, इसलिए इसे स्पष्ट रूप से बताएं:

तीन intमान प्रदान किए गए , यह एक रंग का प्रतिनिधित्व करने वाला एक वैध हेक्स ट्रिपल लौटाएगा। यदि वे मान [0,255] के बीच हैं, तो यह उन लोगों को RGB मानों के रूप में मानेगा और उन मानों के अनुरूप रंग लौटाएगा।


20

यह एक पुराना प्रश्न है, लेकिन जानकारी के लिए, मैंने रंगों और कॉलोर्मैप से संबंधित कुछ उपयोगिताओं के साथ एक पैकेज विकसित किया है और इसमें rgb2hex फ़ंक्शन है जिसमें आप ट्रिपल को हेक्सा मान में परिवर्तित करना चाहते हैं (जो कि कई अन्य पैकेजों में पाया जा सकता है, जैसे matplotlib)। यह पिपी पर है

pip install colormap

और फिर

>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'

इनपुट की वैधता की जाँच की जाती है (मान 0 और 255 के बीच होना चाहिए)।


3
मैंने rgb2hex का उपयोग करने की कोशिश की, लेकिन एक त्रुटि मिली "ImportError: no मॉड्यूल जिसका नाम easydev.tools है"। क्या आप इसका कोई समाधान सुझा सकते हैं?
अभिलाषा Ab ’

पुनः स्थापित करने की कोशिश करें। फिर 'pip3 install easydev'।
शौंकक रे

16

मैंने इसके लिए एक पूर्ण अजगर कार्यक्रम बनाया है, निम्न कार्य आरजीबी को हेक्स में बदल सकते हैं और इसके विपरीत।

def rgb2hex(r,g,b):
    return "#{:02x}{:02x}{:02x}".format(r,g,b)

def hex2rgb(hexcode):
    return tuple(map(ord,hexcode[1:].decode('hex')))

आप निम्न लिंक पर पूर्ण कोड और ट्यूटोरियल देख सकते हैं: पायथन का उपयोग करके आरजीबी हेक्स और हेक्स से आरजीबी रूपांतरण


यह आरजीबी के दशमलव मूल्य के लिए काम नहीं करता है। क्या आप मुझे इसका कोई समाधान सुझा सकते हैं?
अभिलाषा Ab ’

गोल। अंतिम रंग में बहुत बड़ा अंतर नहीं होना चाहिए।
शौंकक रे

9
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')

या

from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')

python3 थोड़ा अलग है

from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))

3

ध्यान दें कि यह केवल python3.6 और इसके बाद के संस्करण के साथ काम करता है।

def rgb2hex(color):
    """Converts a list or tuple of color to an RGB string

    Args:
        color (list|tuple): the list or tuple of integers (e.g. (127, 127, 127))

    Returns:
        str:  the rgb string
    """
    return f"#{''.join(f'{hex(c)[2:].upper():0>2}' for c in color)}"

ऊपर के बराबर है:

def rgb2hex(color):
    string = '#'
    for value in color:
       hex_string = hex(value)  #  e.g. 0x7f
       reduced_hex_string = hex_string[2:]  # e.g. 7f
       capitalized_hex_string = reduced_hex_string.upper()  # e.g. 7F
       string += capitalized_hex_string  # e.g. #7F7F7F
    return string

यह फ़ंक्शन rgb2hex, (13,13,12) पर लागू होता है, 0xDDC देता है, लेकिन वेबसाइट RGB को HEX इसे 0x0D0D0C के रूप में देता है, और यह भी विचार के साथ सम्‍मिलित करता है कि tthe संख्या 13 * 65536 + 13 * 256 + 12 होनी चाहिए। और 0xDDC 3548. के रूप में अजगर द्वारा पढ़ा जाता है
लार्स Ericson

सीएसएस रंग असंगत हैं। 6-अंकीय हेक्स रंग, 3-अंकीय हेक्स रंग, दशमलव और प्रतिशत के साथ आरजीबी संकेतन, hsl, आदि मैंने हमेशा 6 अंक हेक्स रंग प्रदान करने के लिए सूत्र को घुमाया है, और हालांकि मुझे लगता है कि यह अधिक सुसंगत हो सकता है, मैं मुझे यकीन नहीं है कि यह अधिक सही है।
ब्रायन ब्रगमैन

3

आप लैम्ब्डा और एफ-स्ट्रिंग्स का उपयोग कर सकते हैं (अजगर 3.6+ में उपलब्ध है)

rgb2hex = lambda r,g,b: f"#{r:02x}{g:02x}{b:02x}"
hex2rgb = lambda hx: (int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16))

प्रयोग

rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format


1
कारणों की एक मेजबान के लिए लैम्ब्डा को सीधे कॉल करने की अनुशंसा नहीं की जाती है। मैंने उन्हें इस तरह के एक प्रोजेक्ट पर इस्तेमाल किया, जिसकी समीक्षा की गई और सभी ने एक ही बात कही, सीधे कॉल करने के लिए नहीं।
मिकीबी

2
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)

background = RGB(0, 128, 64)

मुझे पता है कि पायथन में एक-लाइनर्स जरूरी नहीं कि कृपया देखें। लेकिन कई बार मैं पायथन पार्सर की अनुमति का फायदा नहीं उठा सकता। यह Dietrich Epp के समाधान (सर्वोत्तम) के रूप में एक ही उत्तर है, लेकिन एकल पंक्ति फ़ंक्शन में लिपटा हुआ है। तो, धन्यवाद आप Dietrich!

मैं इसे अब tkinter के साथ उपयोग कर रहा हूँ :-)


2

यहां स्थितियों को संभालने के लिए एक अधिक संपूर्ण कार्य है जिसमें आप रेंज [0,1] या श्रेणी [0,253] में RGB मान रख सकते हैं ।

def RGBtoHex(vals, rgbtype=1):
  """Converts RGB values in a variety of formats to Hex values.

     @param  vals     An RGB/RGBA tuple
     @param  rgbtype  Valid valus are:
                          1 - Inputs are in the range 0 to 1
                        256 - Inputs are in the range 0 to 255

     @return A hex string in the form '#RRGGBB' or '#RRGGBBAA'
"""

  if len(vals)!=3 and len(vals)!=4:
    raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!")
  if rgbtype!=1 and rgbtype!=256:
    raise Exception("rgbtype must be 1 or 256!")

  #Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBA
  if rgbtype==1:
    vals = [255*x for x in vals]

  #Ensure values are rounded integers, convert to hex, and concatenate
  return '#' + ''.join(['{:02X}'.format(int(round(x))) for x in vals])

print(RGBtoHex((0.1,0.3,  1)))
print(RGBtoHex((0.8,0.5,  0)))
print(RGBtoHex((  3, 20,147), rgbtype=256))
print(RGBtoHex((  3, 20,147,43), rgbtype=256))

1

में अजगर 3.6 , तो आप उपयोग कर सकते हैं च-तार इस क्लीनर बनाने के लिए:

rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'

बेशक आप इसे एक फंक्शन में रख सकते हैं , और एक बोनस के रूप में, मान गोल हो जाते हैं और इंट में बदल जाते हैं :

def rgb2hex(r,g,b):
    return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'

rgb2hex(*rgb)

1

आप बिट बुद्धिमान ऑपरेटरों का भी उपयोग कर सकते हैं, जो बहुत ही कुशल है, हालांकि मुझे संदेह है कि आप इस तरह से कुछ के साथ दक्षता के बारे में चिंतित होंगे। यह अपेक्षाकृत साफ भी है। ध्यान दें कि यह क्लैंप या चेक बाउंड नहीं करता है। कम से कम पायथन 2.7.17 के बाद से इसका समर्थन किया गया है ।

hex(r << 16 | g << 8 | b)

और इसे बदलने के लिए यह एक # के साथ शुरू होता है आप कर सकते हैं:

"#" + hex(243 << 16 | 103 << 8 | 67)[2:]

1

मैं वास्तव में हैरान हूं कि किसी ने इस दृष्टिकोण का सुझाव नहीं दिया:

पायथन 2 और 3 के लिए:

'#' + ''.join('{:02X}'.format(i) for i in colortuple)

अजगर 3.6+:

'#' + ''.join(f'{i:02X}' for i in colortuple)

एक समारोह के रूप में:

def hextriplet(colortuple):
    return '#' + ''.join(f'{i:02X}' for i in colortuple)

color = (0, 128, 64)
print(hextriplet(color))
#008040

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.