मेरे पास एआरजीबी रंग मानचित्र के लिए चार पूर्णांक मान (0 - 255) हैं।

अब मैं इन चार पूर्णांकों का एक अद्वितीय फ्लोट या पूर्णांक बनाना चाहता हूं। क्या इसे निम्न की तरह करना संभव है?

sum  = 4 * 255 + A;
sum += 3 * 255 + R;
sum += 2 * 255 + G;
sum += 1 * 255 + B;

क्या मूल्य वास्तव में अद्वितीय है?

rgb
11
Roby 9 सितंबर 2011, 11:43

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 ने लिखा है, + ऑपरेटर का नहीं, बल्कि | (बिटवाइज या ) ऑपरेटर, क्योंकि यह इस विशेष मामले में तेज होना चाहिए।

29
Community 23 मई 2017, 15:17

आप यह कर सकते हैं:

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;
12
DarkDust 9 सितंबर 2011, 12:03
#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;
}
0
snb 3 पद 2018, 20:57