सी ++: स्क्रॅचमधून बिटमॅप प्रतिमा कशी लिहावी.

प्रतिमा प्रक्रिया करणे हा एक जटिल ऑब्जेक्ट डिटेक्शनवर साध्या फिल्टरिंगचा विषय आहे. आपल्यापैकी ज्यांना खोलीत जाण्याची इच्छा आहे आणि संगणकात प्रतिमा कशी संग्रहित केली जाते हे जाणून घेऊ इच्छित असल्यास, हे योग्य ठिकाण आहे.

या ट्यूटोरियल मध्ये आपण साध्या निळ्या रंगाची बिटमैप प्रतिमा कशी लिहावी ते पाहू.

पूर्वावलोकन

या ट्यूटोरियलमध्ये वापरलेला दृष्टिकोन केवळ अशा सिस्टिमशी सुसंगत आहे जी लिटल-एंडियन बाइट स्वरूपात डेटा प्रक्रिया करतात (बहुतेक इंटेल आणि एएमडी मशीनमध्ये वापरली जातात).

पूर्व शर्तीः

  • सी ++ चे मूलभूत ज्ञान

I. बायनरी फाइल स्वरूपनाची ओळख

बायनरी फाईल म्हणजे बिट्सचा संग्रह म्हणजेच 1 आणि 0 से फाईल्स मध्ये संग्रहित. बहुतेक बायनरी फाईल फॉरमॅट मध्ये बाईट बाईट बाय बाईट संग्रहित असते, बाईट म्हणजे 8 बिटचा संग्रह. बाइट्स माहिती संग्रहित करण्यासाठी क्रमाने व्यवस्थित लावले आहेत. बहुतेक बायनरी फायलींमध्ये दोन मोठे भाग असतात:

  • शीर्षलेख

बायनरी फाईलमधील शीर्षलेखात मेटा डेटा असतो (डेटाबद्दल अतिरिक्त माहिती, उदाहरणार्थ प्रतिमेची रूंदी आणि उंची).

  • शरीर

बायनरी फाईलच्या मुख्य भागामध्ये वास्तविक डेटा असतो. बिटमैप फाईलच्या बाबतीत ही प्रतिमेमधील प्रत्येक पिक्सलबद्दलची माहिती आहे.

II. बिटमॅप फाइल काय आहे?

बिटमॅप फाईलमध्ये मुळात व्हेरिएबल साईजचा हेडर असतो, परंतु बहुतेक वापरली जाणारी हेडर 54tes बाइटची असते. या ट्यूटोरियल मध्ये आपण 24 बिट बिटमॅप प्रतिमा लिहित आहोत. 24 बिट बिटमॅप प्रतिमेच्या मुख्य भागामध्ये प्रत्येक पिक्सेलसाठी मूल्य असते. प्रत्येक पिक्सेलमध्ये बीजीआर (निळा, हिरवा आणि लाल) अनुक्रमात 3 रंग चॅनेल असतात, जिथे प्रत्येक चॅनेल 1 बाइटचे असते. म्हणून 24 बिट बिटमॅप फाइलमधील प्रत्येक पिक्सेल 3 बाइट (किंवा 24 बिट) चा असतो.

(बिटमैप फाइल स्वरूपन तपासणीच्या तपशीलवार वैशिष्ट्यांसाठी: बिटमैप-वैशिष्ट्य)

III. कोड

(पूर्ण उदाहरण कोडसाठी: येथे क्लिक करा)

  • मानक ग्रंथालयांसह:
# समाविष्ट करा // विशिष्ट आकाराच्या पूर्णांकासाठी
# समाविष्ट करा // फाइल हाताळणीसाठी
नेमस्पेस एसटीडी वापरणे;
  • शीर्षलेख तयार करीत आहे:

बिटमैप फाईलमध्ये मेटा डेटासाठी दोन शीर्षलेख आहेत. प्रथम शीर्षलेख (बिटमैप फाइल शीर्षलेख) सांगते की ही बायनरी फाइल एक बिटमैप फाइल आहे. पुढील शीर्षलेख (बिटमैप माहिती शीर्षलेख) मध्ये प्रतिमेबद्दल अतिरिक्त मेटा-डेटा आहे.

बिटमॅप फाइल शीर्षलेख (14 बाइट) साठी आम्हाला खालील डेटा स्ट्रक्चर तयार करणे आवश्यक आहे:

स्ट्रक्चर BmpHeader {
चार बिटमैपसिग्नेचरबाइट्स [2] = {'बी', 'एम'};
uint32_t आकारOfBitmapFile = 54 + 786432;
uint32_t आरक्षितबाइट्स = 0;
uint32_t पिक्सेलडेटाऑफसेट = 54;
} बीएमपीहेडर;

पहिले दोन बाइट 'बी' आणि 'एम' बिटमैप फाईल फॉरमॅटसाठी अनन्य आहेत (त्यातील बिटमैप फॉरमॅटिफिकेशन वैशिष्ट्य अजूनही आहेत.) पुढील चार बाइटमध्ये बाइट मधील बिटमॅप फाइलचे एकूण आकार आहेत. आम्ही 512 बाय 512 बिटमॅप प्रतिमा तयार करीत असताना, एकूण आकार मेटा डेटा (14 + 40 = 54 बाइट) आणि पिक्सेलचा आकार (512 * 512 * 3 = 7863432) ची बेरीज आहे, प्रत्येक पिक्सेल 24 मध्ये 3 बाइटचा असतो बिट बिटमैप फाइल). बिटमॅप फाइल शीर्षलेखातील शेवटच्या फील्डमध्ये फाइलच्या प्रारंभापासून प्रतिमेच्या पिक्सेल डेटाचे ऑफसेट असते. आमच्या बाबतीत ऑफसेट bytes बाइट्स आहे, कारण आपला पिक्सेल डेटा बिटमैप फाइल शीर्षलेख आणि माहिती शीर्षलेख (१ + + 40० =) 54) च्या बरोबर आहे.

बिटमॅप फाइलमध्ये माहितीचे विविध प्रकार आहेत, परंतु सर्वात सामान्य म्हणजे 40 बाइट बिटमैप माहिती शीर्षलेख आहे, म्हणून आम्हाला ते खालील डेटा स्ट्रक्चरमध्ये लिहिण्याची आवश्यकता आहे:

स्ट्रक्चर BmpInfoHeader {
uint32_t आकारOfThisHeader = 40;
इंट 32_t रुंदी = 512;
इंट 32_t उंची = 512;
uint16_t संख्याऑफ कलरप्लेनेस = 1; // 1 असणे आवश्यक आहे
uint16_t colorDepth = 24;
uint32_t कॉम्प्रेशनमेथोड = 0;
uint32_t RawBitmapDataSize = 0;
इंट 32_t क्षैतिज परिणाम = 3780; प्रति मीटर पिक्सेलमध्ये //
इंट 32_t व्हर्टिकल रीझोल्यूशन = 3780; प्रति मीटर पिक्सेलमध्ये //
uint32_t colorTableEntries = 0;
uint32_t महत्वाचे भाषांतर = 0;
} bmpInfoHeader;

बिटमॅप फाइलची उंची देखील नकारात्मक असू शकते (आपण स्वाक्षरी केलेले पूर्णांक लक्षात घेतले असतील). जेव्हा उंची नकारात्मक असेल तर फाइलमधील पहिला पिक्सेल प्रतिमेच्या वरच्या डाव्या बाजूस काढला जातो. तथापि, बिटमैप फायलींचे मानक सकारात्मक उंची वापरणे आहे आणि फाइलमधील पहिला पिक्सेल प्रतिमेच्या तळाशी डाव्या बाजूस अन्य पिक्सेलद्वारे काढलेला आहे.

बिटमॅप फाइलमध्ये रंग सारणी देखील असू शकते परंतु 24 बिट बिटमॅप फाइलमध्ये ती अनिवार्य नाही, म्हणून आम्ही या उदाहरणात एखादी तयार करणार नाही.

  • पिक्सेल तयार करीत आहे:

मी एक मोनो कलर बिटमॅप प्रतिमा तयार करीत असताना (सर्व पिक्सेलचे मूल्य समान आहे), मी पिक्सेलसाठी एक अतिरिक्त रचना तयार करीत आहे:

स्ट्रक्चर पिक्सेल {
uint8_t निळा = 255;
uint8_t हिरव्या = 255;
uint8_t लाल = 0;
ixel पिक्सेल;

पिक्सलमधील प्रत्येक चॅनेल 24 बिट बिटमॅप फाईलसाठी 1 बाइटचा स्वाक्षरी केलेला पूर्णांक असणे आवश्यक आहे. जेथे 255 जास्तीत जास्त रंगाची तीव्रता निर्दिष्ट करते आणि 0 रंग नसतानाही निर्दिष्ट करते.

  • मुख्य कार्य:
इंट मेन (इंट आरजीसी, चार ** आर्गेव्ही) {
ऑफस्ट्रीम फाऊट ("आउटपुट.बीएमपी", आयओएस :: बायनरी);
fout.writ ((char *) & bmpHeader, 14);
fout.writ ((char *) & bmpInfoHeader, 40);
// पिक्सेल डेटा लिहिणे
आकार_t संख्याऑफपिक्सल = bmpInfoHeader.width * bmpInfoHeader.height;
(इंट i = 0; i <संख्याऑफपिक्सल; आय ++) {
fout.writ ((चार *) & पिक्सेल, 3);
}
fout.close ();
रिटर्न 0;
}

कार्यप्रदर्शन अनुकूलित करण्यासाठी स्ट्रक्चरमध्ये पॅडिंग (अतिरिक्त बाइट्स) जोडले जाऊ शकतात. म्हणूनच आकार () अचूक मूल्य परत करणार नाही. म्हणून मी स्ट्रीम :: राइट () मेथडमध्ये प्रत्येक स्ट्रक्चा आकार मॅन्युअली निर्दिष्ट केला आहे.

IV. निष्कर्ष

म्हणून जर आपण आपल्या प्रथम बिटमॅप फाइल लिहिण्यात यशस्वी झाला असेल तर खांद्यावर थाप द्या. पुढे आपणास विविध प्रकारच्या बिटमॅप फाइल्स लिहिण्यास स्वारस्य असेल, त्या चेक बिटमैप वैशिष्ट्यासाठी. कुडो आणि शिकत रहा!

हे देखील पहा

मी (एक 15 वर्षांचा) पायथन कसा शिकू शकतो, जेणेकरून मशीन शिक्षणाशी संबंधित असलेल्या त्याच्या कल्पना कार्यान्वित करण्यासाठी तो त्याचा वापर करू शकेल? टायटॅनियम कसे ओळखावे2018 मध्ये ऑफ-पृष्ठ ईकॉमर्स सह जिंकण्याचा सर्वोत्तम मार्ग कोणता आहे? HTML आणि CSS शिकण्यास किती वेळ लागेल? माझ्याकडे Android साठी अॅप कल्पना आहे. मला शून्य प्रोग्रामिंग चे ज्ञान आहे. मला अनुप्रयोग तयार करायचा आहे आणि तो प्रकाशित करायचा आहे. मी कसा प्रारंभ करू? (* तपशील पहा *, दिलगीर आहोत आगाऊ)?मला सी प्रोग्रामिंग भाषा शिकायची आहे. एक अनुभवी प्रोग्रामर म्हणून, आपण मला कोठून शिकण्यास सुचवाल?मी नुकतेच प्रोग्रामिंग सुरू केले आणि माझा पहिला कोड लिहिला. मी हे सॉफ्टवेअरमध्ये कसे बनवू?आपल्याकडे अ‍ॅप किंवा वेबसाइटची कल्पना असल्यास आपण कोणाशी बोलले पाहिजे परंतु आपल्याला कोड कसे वापरावे हे माहित नाही आणि आपल्याला कल्पना चोरी करू इच्छित नाही?