मेरे पास एआरजीबी रंग मानचित्र के लिए चार पूर्णांक मान (0 - 255) हैं।
अब मैं इन चार पूर्णांकों का एक अद्वितीय फ्लोट या पूर्णांक बनाना चाहता हूं। क्या इसे निम्न की तरह करना संभव है?
sum = 4 * 255 + A;
sum += 3 * 255 + R;
sum += 2 * 255 + G;
sum += 1 * 255 + B;
क्या मूल्य वास्तव में अद्वितीय है?
3 जवाब
आप बेस कन्वर्ट या उस तरह का कुछ करने की कोशिश कर रहे हैं। वैसे भी तर्क आधार परिवर्तित करने जैसा है। 4 बाइट्स = 32 बिट। तो 32 बिट अहस्ताक्षरित पूर्णांक अच्छा करेगा।
इस मामले में, आपके पास है:
ARGB = A<<24 + R<<16 + G<<8 + B
यह इस प्रकार है:
आपके पास 4 बाइट डेटा है, जिसका अर्थ है
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
जहां एक्स या तो 1 या 0 मूल्यवान बिट है। आप उन्हें इस तरह मैप करते हैं:
AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
और फिर आपको बस इतना करना है कि उन्हें जोड़ना है, लेकिन इससे पहले आप बिट्स को स्थानांतरित कर दें। आप A
बिट्स को बाईं ओर, 8*3 (R
, G
और B
बिट्स की सीमा से परे) में शिफ्ट करते हैं, फिर R
बिट्स 8*2, और इसी तरह।
आप इन 32 बिट पूर्णांकों को जोड़ना समाप्त करते हैं:
AAAAAAAA 00000000 00000000 00000000
00000000 RRRRRRRR 00000000 00000000
00000000 00000000 GGGGGGGG 00000000
00000000 00000000 00000000 BBBBBBBB
जहां A
, R
, G
, B
या तो 0
या 1
हो सकते हैं, और समग्र रूप से 8 बिट मान का प्रतिनिधित्व करते हैं द चैनल। फिर आप बस उन्हें जोड़ते हैं, और परिणाम प्राप्त करते हैं। या जैसा कि DarkDust ने लिखा है, +
ऑपरेटर का नहीं, बल्कि |
(बिटवाइज या ) ऑपरेटर, क्योंकि यह इस विशेष मामले में तेज होना चाहिए।
आप यह कर सकते हैं:
a
, r
, g
और b
को unsigned char
/uint8_t
प्रकार का मानते हुए:
uint32_t color = 0;
color |= a << 24;
color |= r << 16;
color |= g << 8;
color |= b;
या अधिक सामान्य (a
, r
, g
और b
किसी भी पूर्णांक प्रकार के होने के कारण):
uint32_t color = 0;
color |= (a & 255) << 24;
color |= (r & 255) << 16;
color |= (g & 255) << 8;
color |= (b & 255);
यह आपको प्रत्येक ARGB संयोजन के लिए एक अद्वितीय पूर्णांक देगा। आप मान वापस इस तरह प्राप्त कर सकते हैं:
a = (color >> 24) & 255;
r = (color >> 16) & 255;
g = (color >> 8) & 255;
b = color & 255;
#include<bitset>
void printBits(string s, int x)
{
bitset <64> b(x);
cout<<"\n"<<s<< " " << b;
}
long RGB(int a, int r, int g, int b)
{
printBits("alpha ", a);
printBits("red ", r);
printBits("green ", g);
printBits("blue ", b);
long l = 0;
l |= a << 24;
l |= r << 16;
l |= g << 8;
l |= b;
printBits("packed ARGB", l);
return l;
}
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
rgb
RGB रेड-ग्रीन-ब्लू के लिए खड़ा है और तीन मानों का उपयोग करके एक रंग निर्दिष्ट करता है, जो रंग में लाल, हरे और नीले रंग की संबंधित राशि का प्रतिनिधित्व करता है। आरजीबी आजकल अधिकांश रंग प्रदर्शन उपकरणों द्वारा उपयोग किए जाने वाले रंग मॉडल का आधार है।