2010-02-14 20 views
14

मैं एक आरजीबी पूर्णांक को संबंधित आरजीबी ट्यूपल (R,G,B) में कैसे परिवर्तित कर सकता हूं? काफी सरल लगता है, लेकिन मुझे Google पर कुछ भी नहीं मिला।आरजीबी इंट से आरजीबी - पायथन

मुझे पता है कि हर आरजीबी (r,g,b) के लिए आप पूर्णांक n = r256^2 + g256 + b, मैं अजगर में रिवर्स कैसे हल कर सकते हैं है, आईई एक n को देखते हुए, मैं r, g, b मूल्यों की जरूरत है।

+0

आरजीबी पूर्णांक से आपका क्या मतलब है? –

+1

http://www.shodor.org/stella2java/rgbint.html, केवल सूत्र जो मैंने अभी प्रश्न में संपादित किया है। '(255, 255, 255)' = '16777215' – Omar

उत्तर

37

मैं हर तरह से एक अजगर विशेषज्ञ नहीं हूँ, लेकिन जहाँ तक मुझे पता है के रूप में यह सी

यदि ऐसा है तो यह काम करना चाहिए और यह भी सापेक्ष का उपयोग कर की तुलना में बहुत जल्दी होना चाहिए और उसी के रूप में ऑपरेटरों है विभाजन।

Blue = RGBint & 255 
Green = (RGBint >> 8) & 255 
Red = (RGBint >> 16) & 255 

क्या यह प्रत्येक मामले में सबसे कम बाइट बाहर नकाब यह करता है (.. द्विआधारी और 255 के साथ एक 8 एक बिट के बराबर है)। हरे और लाल घटक के लिए यह वही करता है, लेकिन कलर-चैनल को सबसे कम बाइट में बदल देता है।

+1

+1 हालांकि% और // का उपयोग करने वाले समाधान पर गति का लाभ न्यूनतम होना चाहिए। फ़ंक्शन कॉल के साथ समाधान से निश्चित रूप से बहुत तेज (divmod, struct। [Un] पैक, आदि)। –

14

एक आरजीबी पूर्णांक से:

Blue = RGBint mod 256 
Green = RGBint/256 mod 256 
Red = RGBint/256/256 mod 256 

यह सुंदर बस लागू किया जा सकता है एक बार आप जानते हैं कि यह कैसे प्राप्त करने के लिए। :)

अद्यतन: जोड़ा पायथन समारोह। सुनिश्चित नहीं हैं कि वहाँ यह करने के लिए एक बेहतर तरीका है, लेकिन यह अजगर 3 पर काम करता है और 2,4

def rgb_int2tuple(rgbint): 
    return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256) 

वहाँ भी एक उत्कृष्ट समाधान bitshifting उपयोग करता है और मास्किंग कि इसमें कोई शक नहीं है कि बहुत तेजी से निल्स Pipenbrinck तैनात है कि अगर।

+2

पूर्णांक विभाजन का उपयोग करना न भूलें और विभाजन को फ़्लोट न करें। –

+0

इस तथ्य के बावजूद कि यह पूर्णांक विभाजन और मॉड्यूलो का उपयोग करता है, मुझे नहीं लगता कि मेरा जवाब डाउन्रेट के योग्य है। – Xorlev

+0

नहीं, यह एक डाउनवोट के लायक नहीं है। लोगों ने डाउनवोट-तीर टूलटिप नहीं पढ़ा है और मानते हैं कि डाउनवॉटिंग का अर्थ है "मुझे यह पसंद नहीं है।" – tzot

0

शायद ऐसा करने का एक छोटा रास्ता नहीं है:

dec=10490586 
hex="%06x" % dec 
r=hex[:2] 
g=hex[2:4] 
b=hex[4:6] 
rgb=(r,g,b) 

संपादित करें: यह गलत है - हेक्स में जवाब देता है, ओपी पूर्णांक चाहता था। EDIT2: दुख और विफलता को कम करने के लिए परिष्कृत - यह सुनिश्चित करने के लिए हेक्स हमेशा छह अंकों के रूप में दिखाया गया है [पीटर हान्सन की टिप्पणी के लिए धन्यवाद]।

+1

हेक्स स्ट्रिंग में अपेक्षित छह अंक होने पर यह भी दुर्भाग्य से विफल हो जाएगा। इससे बचने के लिए "% 06x" का प्रयोग करें। –

6

मुझे लगता है कि आपके पास 32-बिट पूर्णांक है जिसमें आरजीबी मान (उदा। एआरजीबी) शामिल है। भी

# Create an example value (this represents your 32-bit input integer in this example). 
# The following line results in exampleRgbValue = binary 0x00FF77F0 (big endian) 
exampleRgbValue = struct.pack(">I", 0x00FF77F0) 

# Unpack the value (result is: a = 0, r = 255, g = 119, b = 240) 
a, r, g, b = struct.unpack("BBBB", exampleRgbValue) 
+0

और अन्य समाधानों की तुलना में बेहद धीमी (2 फ़ंक्शन कॉल) होगी –

+0

सबसे व्यावहारिक नहीं हो सकता है लेकिन यह एक अच्छा समाधान है। – Rich

2
def unpack2rgb(intcol): 
    tmp, blue= divmod(intcol, 256) 
    tmp, green= divmod(tmp, 256) 
    alpha, red= divmod(tmp, 256) 
    return alpha, red, green, blue 

अगर केवल divmod(value, (divider1, divider2, divider3…)) सुझाव स्वीकार कर लिया गया था, यह सरल बनाया है | विभिन्न समय रूपांतरण: तो फिर तुम बाइनरी डेटा struct मॉड्यूल का उपयोग कर खोल सकते हैं।

9
>>> import struct 
>>> str='aabbcc' 
>>> struct.unpack('BBB',str.decode('hex')) 
(170, 187, 204) 

for python3: 
>>> struct.unpack('BBB', bytes.fromhex(str)) 

और

>>> rgb = (50,100,150) 
>>> struct.pack('BBB',*rgb).encode('hex') 
'326496' 

for python3: 
>>> bytes.hex(struct.pack('BBB',*rgb)) 
5
>>> r, g, b = (111, 121, 131) 
>>> packed = int('%02x%02x%02x' % (r, g, b), 16) 

यह निम्न पूर्णांक का उत्पादन:

>>> packed 
7305603 

फिर आप खोल दे सकते हैं या तो लंबे समय तक स्पष्ट रास्ता:

>>> packed % 256 
255 
>>> (packed/256) % 256 
131 
>>> (packed/256/256) % 256 
121 
>>> (packed/256/256/256) % 256 
111 

..या एक अधिक जटिल तरीके से: गूगल के ऐप्स इंजन छवियाँ अजगर एपीआई का उपयोग कर किसी के लिए भी

>>> packed = int('%02x%02x%02x%02x' % (111, 121, 131, 141), 16) 
>>> [(packed >> (8*i)) & 255 for i in range(4)] 
[141, 131, 121, 111] 
3

बस एक ध्यान दें:

>>> b, g, r = [(packed >> (8*i)) & 255 for i in range(3)] 
>>> r, g, b 

नमूना अंक के किसी भी संख्या, उदा एक RGBA रंग के साथ लागू होता है। मैंने पाया कि मुझे एक ऐसी स्थिति थी जहां मुझे 32-बिट आरजीबी रंग मूल्य के साथ एक विधि प्रदान करना पड़ा।

विशेष रूप से, यदि आप पीएनजी (या पारदर्शी पिक्सेल वाले किसी भी छवि) को परिवर्तित करने के लिए एपीआई का उपयोग कर रहे हैं, तो आपको execute_trubforms विधि को transarent_substitution_rgb नामक एक तर्क के साथ आपूर्ति करने की आवश्यकता होगी जिसे 32-बिट आरजीबी रंग होना चाहिए मूल्य।

DBR के जवाब से उधार, मैं एक विधि इस के समान के साथ आया था:

def RGBTo32bitInt(r, g, b): 
    return int('%02x%02x%02x' % (r, g, b), 16) 

transformed_image = image.execute_transforms(output_encoding=images.JPEG, transparent_substitution_rgb=RGBTo32bitInt(255, 127, 0)) 
-1

आप NumPy का उपयोग कर रहे हैं और आप RGBints की एक सरणी है, तो आप भी सिर्फ अपनी dtype लाल को निकालने के लिए परिवर्तित कर सकते हैं , हरा, नीला और अल्फा घटक:

>>> type(rgbints) 
numpy.ndarray 
>>> rgbints.shape 
(1024L, 768L) 
>>> rgbints.dtype 
dtype('int32') 
>>> rgbints.dtype = dtype('4uint8') 
>>> rgbints.shape 
(1024L, 768L, 4L) 
>>> rgbints.dtype 
dtype('uint8') 
-1

उपरोक्त वर्णित में जोड़ना। एक संक्षिप्त एक लाइनर विकल्प।

# 2003199 or #E190FF is Dodger Blue. 
tuple((2003199 >> Val) & 255 for Val in (16, 8, 0)) 
# (30, 144, 255) 

और भविष्य में किसी भी भ्रम से बचने के लिए।

from collections import namedtuple 
RGB = namedtuple('RGB', ('Red', 'Green', 'Blue')) 
rgb_integer = 16766720 # Or #ffd700 is Gold. 
# The unpacking asterisk prevents a TypeError caused by missing arguments. 
RGB(*((rgb_integer >> Val) & 255 for Val in (16, 8, 0))) 
# RGB(Red=255, Green=215, Blue=0) 
संबंधित मुद्दे