C ++: स्क्रैच से बिटमैप इमेज कैसे लिखें।

इमेज प्रोसेसिंग एक विशाल विषय है जो सरल फ़िल्टरिंग को जटिल ऑब्जेक्ट डिटेक्शन को कवर करता है। आप में से जो लोग गहराई में जाना चाहते हैं और सीखते हैं कि कंप्यूटर में एक छवि कैसे संग्रहीत की जाती है, यह शुरू करने के लिए सही जगह है।

इस ट्यूटोरियल में हम देखेंगे कि कैसे एक साधारण सियान रंगीन बिटमैप छवि लिखी जा सकती है।

पूर्वावलोकन

इस ट्यूटोरियल में उपयोग किया जाने वाला दृष्टिकोण केवल उन प्रणालियों के साथ संगत है जो डेटा को थोड़ा-एंडियन बाइट प्रारूप (ज्यादातर इंटेल और एएमडी मशीनों में उपयोग किया जाता है) में संसाधित करता है।

आवश्यक शर्तें:

  • C ++ का बेसिक ज्ञान

I. बाइनरी फाइल फॉर्मेट्स का परिचय

एक बाइनरी फ़ाइल बिट्स का संग्रह है अर्थात 1s और 0s, एक फ़ाइल में संग्रहीत। अधिकांश बाइनरी फ़ाइल स्वरूपों में जानकारी को बाइट द्वारा संग्रहीत किया जाता है, बाइट 8 बिट का एक संग्रह है। सूचनाओं को संग्रहीत करने के लिए बाइट्स को व्यवस्थित रूप से व्यवस्थित किया जाता है। अधिकांश बाइनरी फ़ाइलों में दो प्रमुख भाग होते हैं:

  • हैडर

एक द्विआधारी फ़ाइल में हैडर में मेटा डेटा होता है (डेटा के बारे में अतिरिक्त जानकारी, उदाहरण के लिए चौड़ाई और एक छवि की ऊंचाई)।

  • तन

एक बाइनरी फ़ाइल के शरीर में वास्तविक डेटा होता है। एक बिटमैप फ़ाइल के मामले में यह छवि में प्रत्येक पिक्सेल के बारे में जानकारी है।

द्वितीय। बिटमैप फ़ाइल क्या है?

बिटमैप फ़ाइल में मूल रूप से वैरिएबल साइज के हेडर होते हैं, हालांकि सबसे अधिक इस्तेमाल किया जाने वाला हेडर 54 बाइट्स का होता है। इस ट्यूटोरियल में हम 24 बिट बिटमैप इमेज लिख रहे हैं। एक 24 बिट बिटमैप छवि के शरीर में प्रत्येक पिक्सेल के लिए मूल्य होता है। प्रत्येक पिक्सेल में BGR (नीला, हरा और लाल) क्रम में 3 रंग चैनल होते हैं, जहाँ प्रत्येक चैनल 1 बाइट का होता है। इसलिए 24 बिट बिटमैप फ़ाइल में प्रत्येक पिक्सेल 3 बाइट्स (या 24 बिट्स) का होता है।

(बिटमैप फ़ाइल प्रारूप जांच के विस्तृत विनिर्देशों के लिए: बिटमैप-विनिर्देश)

तृतीय। कोड

(पूरा उदाहरण कोड के लिए: यहां क्लिक करें)

  • मानक पुस्तकालयों सहित:
#शामिल // विशिष्ट आकार पूर्णांक के लिए
#शामिल // फाइल हैंडलिंग के लिए
नेमस्पेस एसटीडी का उपयोग करना;
  • हैडर बनाना:

मेटा डेटा के लिए बिटमैप फ़ाइल में दो हेडर हैं। पहला हेडर (बिटमैप फ़ाइल हेडर) बताता है कि यह बाइनरी फाइल बिटमैप फाइल है। अगले हेडर (बिटमैप जानकारी हेडर) में छवि के बारे में अतिरिक्त मेटा-डेटा है।

बिटमैप फ़ाइल हेडर (14 बाइट्स) के लिए हमें निम्नलिखित डेटा संरचना बनाने की आवश्यकता है:

संरचना BmpHeader {
char bitmapSignatureBytes [2] = {'B', 'M'};
uint32_t sizeOfBitmapFile = 54 + 786432;
uint32_t आरक्षितबाइट = 0;
uint32_t pixelDataOffset = 54;
} bmpHeader;

पहले दो बाइट्स 'बी' और 'एम' बिटमैप फ़ाइल प्रारूप के लिए अद्वितीय हैं (इसमें अभी भी बिटमैप प्रारूप विनिर्देश की जांच के विभिन्न संस्करण हैं)। अगले चार बाइट्स में बिटमैप फ़ाइल का कुल आकार बाइट्स में होता है। जैसा कि हम 512 बिटमैप छवि द्वारा 512 बना रहे हैं, कुल आकार मेटा डेटा (14 + 40 = 54 बाइट्स) के आकार का योग है और पिक्सेल का आकार (512 * 512 * 3 = 7863432, प्रत्येक पिक्सेल 24 में 3 बाइट्स का है। बिट बिटमैप फ़ाइल)। बिटमैप फ़ाइल हेडर के अंतिम क्षेत्र में फ़ाइल के प्रारंभ से छवि के पिक्सेल डेटा में ऑफसेट होता है। हमारे मामले में ऑफसेट 54 बाइट्स है, क्योंकि बिटमैप फ़ाइल हेडर और सूचना हेडर (14 + 40 = 54) के बाद हमारा पिक्सेल डेटा सही है।

बिटमैप फ़ाइल में विभिन्न प्रकार के जानकारी शीर्षलेख हैं, लेकिन सबसे आम 40 बाइट बिटमैप जानकारी हैडर है, इसलिए हमें इसे निम्न डेटा संरचना में लिखना होगा:

संरचना BmpInfoHeader {
uint32_t sizeOfThisHeader = 40;
int32_t चौड़ाई = 512;
int32_t ऊंचाई = 512;
uint16_t numberOfColorPlanes = 1; // 1 होना चाहिए
uint16_t colorDepth = 24;
uint32_t संपीड़न मेथोड = 0;
uint32_t rawBitmapDataSize = 0;
int32_t होरिजोन्टोल्यूशन = 3780; // प्रति मीटर पिक्सेल में
int32_t verticalResolution = 3780; // प्रति मीटर पिक्सेल में
uint32_t colorTableEntries = 0;
uint32_t महत्वपूर्णकॉलर्स = 0;
} bmpInfoHeader;

बिटमैप फ़ाइल की ऊंचाई भी नकारात्मक हो सकती है (आपने हस्ताक्षर किए पूर्णांक पर ध्यान दिया हो सकता है)। जब ऊंचाई ऋणात्मक होती है, तो फ़ाइल में पहला पिक्सेल छवि के ऊपर बाईं ओर खींचा जाता है। हालाँकि बिटमैप फ़ाइलों के लिए मानक सकारात्मक ऊंचाई का उपयोग करना है और फ़ाइल में पहले पिक्सेल को अन्य पिक्सेल द्वारा छवि के नीचे बाईं ओर खींचा गया है।

बिटमैप फ़ाइल में एक रंग तालिका भी हो सकती है, लेकिन 24 बिट बिटमैप फ़ाइल में यह अनिवार्य नहीं है, इसलिए हम इस उदाहरण में एक नहीं बनाएंगे।

  • पिक्सेल बनाना:

जैसा कि मैं एक मोनो रंग बिटमैप छवि बना रहा हूं (सभी पिक्सेल का समान मूल्य है), मैं पिक्सेल के लिए एक अतिरिक्त संरचना बना रहा हूं:

संरचना पिक्सेल {
uint8_t नीला = 255;
uint8_t हरी = 255;
uint8_t लाल = 0;
}};

24 बिट बिटमैप फ़ाइल के लिए पिक्सेल के प्रत्येक चैनल में 1 बाइट का अहस्ताक्षरित पूर्णांक होना चाहिए। जहां 255 अधिकतम रंग की तीव्रता और 0 रंग की अनुपस्थिति को निर्दिष्ट करता है।

  • मुख्य कार्य:
int main (int argc, char ** argv) {
इनस्ट्रीम फ़ाउट ("आउटपुट.बीएमपी", ios :: बाइनरी);
fout.write ((char *) & bmpHeader, 14);
fout.write ((char *) & bmpInfoHeader, 40);
// पिक्सेल डेटा लेखन
size_t numberOfPixels = bmpInfoHeader. उपलब्धता * bmpInfoHeader.height;
for (int i = 0; मैं 
fout.write ((चार *) और पिक्सेल, 3);
}
fout.close ();
वापसी 0;
}

प्रदर्शन को अनुकूलित करने के लिए कंपाइलर द्वारा एक संरचना को पैडिंग (अतिरिक्त बाइट्स) जोड़ा जा सकता है। इसलिए sizeof () सटीक मान वापस नहीं जा रहा है। इसलिए मैंने मैन्युअल रूप से प्रत्येक संरचना का आकार निर्दिष्ट किया है :: लिखना () विधि।

चतुर्थ। निष्कर्ष

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

यह सभी देखें

मैं (15 वर्षीय) पायथन को कैसे सीख सकता हूं, ताकि वह इसका इस्तेमाल अपने विचार को अंजाम देने के लिए कर सके, जिसमें मशीन लर्निंग शामिल है? टाइटेनियम की पहचान कैसे करें2018 में ऑफ-पेज ईकामर्स के साथ जीतने का सबसे अच्छा तरीका क्या है? HTML और CSS सीखने में कितना समय लगेगा? मैं Android के लिए एक app विचार है। मुझे शून्य प्रोग्रामिंग ज्ञान है। मैं ऐप बनाना और उसे प्रकाशित करना चाहता हूं। मैं कैसे शुरू करूँ? (* विवरण देखें *, माफी पहले से)?मैं C प्रोग्रामिंग लैंग्वेज सीखना चाहता हूं। एक अनुभवी प्रोग्रामर के रूप में, आप मुझे सीखने के लिए कहाँ से सुझाव देते हैं?मैंने अभी प्रोग्रामिंग शुरू की है, और अपना पहला कोड लिखा है। मैं इसे एक सॉफ्टवेयर में कैसे बनाऊँ?यदि आपको किसी ऐप या वेबसाइट के लिए कोई विचार है, तो आपको किससे बात करनी चाहिए, लेकिन आपको पता नहीं है कि कोड कैसे बनाया जाता है, और आप इस विचार को चोरी नहीं करना चाहते हैं?