2011-04-21 14 views
5

मैं कुछ बुनियादी कंप्यूटर ग्राफिक्स के साथ सी ++ के पास आ रहा हूं।क्यों आरजीबी पिक्सेल डेटा के लिए हस्ताक्षर किए गए char?

पिक्सल डेटा आमतौर पर के रूप में प्रस्तुत किया जाता है:

unsigned char *pixels 

और एक अहस्ताक्षरित चार अच्छा है क्योंकि 0 और 255 (256 = 2^8 क्योंकि एक चार 2 बाइट और 1 बाइट है के बीच कोई मान है 8 बिट है ?)। और यह अच्छा है क्योंकि आरजीबी रंग में 0 और 255 के बीच एक संख्या के साथ प्रतिनिधित्व किया जाता है।

लेकिन .. मैं इसे एक मोनक्रोमैटिक छवि के रूप में समझता हूं, सामान्य छवि में मेरे पास आरजीबी है, मेरे पास 3 सरणी रहित चार, एक लाल के लिए, एक हरे रंग के लिए, एक नीले रंग के लिए। कुछ की तरह:

unsigned char *pixels[3] 

लेकिन मैं आरजीबी पिक्सेल डेटा के लिए कुछ इसी तरह कभी नहीं मिली

+4

1 बाइट 8 बिट है। थोड़ा सा 2 राज्य है। तो एक बाइट, 8 बिट्स में 2^8 राज्य हैं।इस प्रकार 1 बाइट में 2^8 = 256 अलग-अलग संभावित राज्य हैं। एक हस्ताक्षरित चार 256 विशिष्ट मानों के साथ 1 बाइट है, 0 से 255। – Ishtar

उत्तर

3
* पिक्सल [3] आप तीन रंग घटकों के लिए अलग सरणियों मिल गया है के साथ

, जबकि फाइलों में के लिए तीन रंग घटकों एक पिक्सेल एक साथ संग्रहीत किया जाता है। यह भी मतलब है कि आप छवि डेटा के पूरे ब्लॉक के लिए एक एकल fread()/fwrite() का उपयोग कर सकते हैं,

4
unsigned char *pixels[3]; 

अहस्ताक्षरित चार करने के लिए तीन संकेत की एक सरणी की घोषणा की। मुझे यकीन नहीं है कि आप यही चाहते हैं।

पिक्सेल का प्रतिनिधित्व करने के कई अलग-अलग तरीके हैं। सबसे सरल शायद कुछ ऐसा है:

struct Pixel 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
}; 

लेकिन आपको कुछ बाहरी प्रारूप के अनुरूप (या चाहते हैं) हो सकता है। एक और लगातार संभावना है कि सभी तीन रंग uint32_t में रखें। इसके अलावा, कुछ ग्राफिक सिस्टम में, चौथा तत्व हो सकता है, और अल्फा, पारदर्शिता का प्रतिनिधित्व करता है।

9

आरजीबी छवियों को आम तौर पर इंटरलीव किए गए क्रम (आर 1, जी 1, बी 1, आर 2, जी 2, बी 2, ...) में संग्रहीत किया जाता है, इसलिए एक पॉइंटर (आर 1) पर्याप्त है। सूचकांक एन के साथ पिक्सेल pixels[3*N+0], pixels[3*N+1] और pixels[3*N+2] के बजाय सिर्फ red[N], green[N], blue[N] में संग्रहीत किया जाता है:

यह थोड़ा मुश्किल अलग-अलग पिक्सेल संबोधित करने के लिए बनाता है।

हालांकि, इसका तेजी से उपयोग करने की सुविधा का लाभ है: कम पॉइंटर्स आसान प्रोग्राम का नेतृत्व करते हैं, उनकी गति में सुधार करते हैं; इंटरलीव किए गए ऑर्डर मेमोरी कैशिंग को और अधिक प्रभावी बनाता है।

3

सच जब भी आप बाइट्स के एक ब्लॉक को देखें, क्योंकि तथ्य यह है unsigned char सी विनिर्देश द्वारा प्रकार अपने आप में कोई पैडिंग है के प्रकार के unsigned char* का होने वाला है (यानी, हर बिट में एक मूल्य के लिए प्रयोग किया जाता है बाइट, और वहां कोई गद्देदार बिट्स नहीं हैं जिनका उपयोग नहीं किया जाता है), और पिक्सेल-डेटा एक्स बाइट्स के कुछ ब्लॉक होने के बिना कुछ पैडिंग नहीं होगा (कम से कम आंतरिक पैडिंग नहीं ... बफर के अंत में पैडिंग हो सकती है संरेखण उद्देश्यों के लिए)। यह कहीं भी ढेर पर आवंटित किया जाएगा। तो इससे कोई फर्क नहीं पड़ता कि यह मोनोक्रोम, रंग-डेटा इत्यादि होने जा रहा है, आप अक्सर पाएंगे कि एक पिक्सेल बफर को unsigned char पॉइंटर के माध्यम से इंगित किया जाएगा, और फिर आप इसे struct पर डाल सकते हैं जैसे जेम्स ने आसानी से उल्लेख किया है पिक्सेल जानकारी तक पहुंचें। अन्य बार आपको एनाटोलिग उल्लेखों जैसे बफर में अनुक्रमणित करना पड़ सकता है। लेकिन अंत में, पिक्सल का एक बफर डेटा का केवल एक बफर है, और unsigned char* टाइप करके डेटा बाइट्स के सामान्य बफर को सी/सी ++ में एक्सेस किया जाना चाहिए।

संबंधित मुद्दे