[संगीत खेल] ZAMYLA चान: यह मिस स्कारलेट था मोमबत्ती के साथ. Whodunit? खैर, हम पता लगाने के लिए जा रहे हैं. बोर्ड खेल सुराग में, आप कर सकते हैं एक भौतिक लाल छवि दी जानी. और उस छवि बहुत लाल और है धब्बेदार, और अपने काम के लिए है छिपा संदेश प्रकट करते हैं. और आम तौर पर आप एक लाल के साथ प्रदान कर रहे हैं आवर्धक कांच, या करने के लिए एक लाल स्क्रीन उस छिपा संदेश प्रकट करते हैं. ठीक है, हम है कि नकल करने के लिए जा रहे हैं. Whodunit में, आप एक बिटमैप छवि दी रहे हैं कि, बहुत धब्बेदार और लाल दिखता है और फिर whodunit कार्यक्रम चलाने एक छिपा संदेश प्रकट करने के लिए. तो चलो चरणों में यह टूट जाने. सबसे पहले, आप फ़ाइल को खोलने के लिए चाहते हैं - तुम्हें दे दिया गया है कि सुराग. और फिर भी एक बना फैसले बिटमैप फ़ाइल. तो फिर तुम बिटमैप अद्यतन करना चाहते हैं फैसले outfile के लिए जानकारी हैडर. बाद में उस पर और अधिक. और उसके बाद में पढ़ने के लिए जा रहे हैं सुराग, scanline, पिक्सेल द्वारा पिक्सेल, के रूप में पिक्सेल रंग बदल रहा है आवश्यक है, और लेखन फैसले में उन - में पिक्सेल द्वारा पिक्सेल फैसले scanline. हम कैसे इस बारे में जाने शुरू कर दिया? खैर, सौभाग्य से, हम copy.c है वितरण कोड में. और यह साबित करने के लिए जा रहा है हमारे लिए काफी उपयोगी है. Copy.c, एक फ़ाइल को खोलता है कि में पढ़ता फिर infile का शीर्षक है, और अपडेट outfile के हैडर. और फिर इसमें प्रत्येक पिक्सेल पढ़ता फिर scanline, पिक्सेल द्वारा पिक्सेल, और outfile में है कि पिक्सेल लिखते हैं. तो, अपना पहला कदम हो सकता है निम्नलिखित चलाने के लिए हो टर्मिनल में कमांड - सी.पी. copy.c whodunit.c. इस की एक प्रतिलिपि बनाएगा copy.c whodunit.c नाम दिया है. तो खोलने के लिए हमारा पहला कदम फ़ाइल, ठीक है, एक सटीक नहीं है copy.c. में उस की प्रतिकृति तो मैं उस पर विचार करने के लिए छोड़ देंगे. हम इस PSET में साथ है क्या कर रहे हैं फाइल मैं / हे, मूल रूप से फाइलें ले रही है, पढ़ना, लेखन, संपादन उन्हें. कैसे आप पहली बार एक फ़ाइल खुला है? ठीक है, तुम एक फ़ाइल की घोषणा करने जा रहे हैं सूचक, और उसके बाद आप कॉल समारोह fopen. पथ, या उस के नाम में पारित फ़ाइल, और तब इच्छित मोड अंदर उस फ़ाइल को खोलने के लिए एक अनुसंधान में पासिंग खुलेगा पढ़ने के लिए foo.bmp. जबकि एक w में गुजरने के साथ fopen होगा खुले bar.bmp, फाइल लिखने के लिए और वास्तव में यह संपादन. तो अब हम फ़ाइल खोल दिया है कि, हमारे अगले कदम के हैडर जानकारी अद्यतन करने के लिए है outfile के लिए. एक हैडर जानकारी क्या है? खैर, सबसे पहले हम पता करने की जरूरत क्या एक बिटमैप है. एक बिटमैप सिर्फ एक सरल है बाइट्स की व्यवस्था. और वे इस फाइल में घोषित कर रहे हैं के एक समूह के साथ यहां, bmp.h, क्या एक बिटमैप की जानकारी वास्तव में से बाहर कर दिया है. लेकिन क्या हम वास्तव में के बारे में परवाह है बिटमैप फ़ाइल शीर्षक, यहीं है, और यहाँ पर बिटमैप जानकारी हेडर,. हैडर एक जोड़ी के से बना है बहुत उपयोगी साबित होगा कि चर. जो biSizeImage, वहाँ है बाइट्स में छवि का कुल आकार. और इस पिक्सल और पैडिंग भी शामिल है. गद्दी बहुत महत्वपूर्ण है, लेकिन हम है कि बाद में मिल जाएगा. BiWidth की चौड़ाई का प्रतिनिधित्व करता है पिक्सल शून्य से गद्दी में छवि. BiHeight भी तो ऊंचाई है पिक्सल में छवि की. और फिर BITMAPFILEHEADER और जैसा कि मैंने उल्लेख BITMAPINFOHEADER, इससे पहले, उन प्रतिनिधित्व कर रहे हैं structs के रूप में. तो, आप फ़ाइल शीर्षक का उपयोग नहीं कर सकते ही है, लेकिन आप को प्राप्त करना चाहते हूँ अंदर उन चर. ठीक है. तो हम कैसे हैडर जानकारी अद्यतन करते हैं? खैर, सबसे पहले हमें देखना है कि हम चाहे किसी भी जानकारी से बदलने की जरूरत को infile, सुराग, outfile, फैसले. कुछ भी इस मामले में बदल रहा है? खैर, असल में, हम जा रहे हैं नहीं, क्योंकि बस रंग बदल रही हो. हम फ़ाइल को बदलने नहीं जा रहे हैं आकार, छवि आकार, चौड़ाई, या ऊंचाई. तो आप ने अब सभी के लिए सही हो बस प्रत्येक पिक्सेल नकल. ठीक है. तो अब यह कैसे हम वास्तव में हम देखते हैं फ़ाइल से हर पिक्सेल पढ़ सकते हैं. एक और फाइल मैं / ओ समारोह खेलने में आ जाएगा - fread. यह संरचना के लिए एक संकेत में लेता है जो बाइट्स में शामिल होंगे आप पढ़ रहे हैं. तो तुम उस में पढ़ रहे हैं. और फिर आप जो, एक आकार में पारित हर तत्व का आकार है कि आप पढ़ने के लिए चाहते हैं. इधर, समारोह sizeof काम में आ जाएगा. तो फिर तुम संख्या में पारित जो के तत्वों की संख्या का प्रतिनिधित्व करता है पढ़ने के लिए आकार. और फिर अंत में, inptr, जो है आप कर रहे हैं कि फाइल सूचक से पढ़ने के लिए जा रहा है. तो उन तत्वों के सभी के अंदर कर रहे हैं inptr और वे डेटा के लिए जा रहे हैं. के एक छोटे से उदाहरण देखते हैं. मैं डेटा दो कुत्तों में पढ़ना चाहते हैं, ठीक है, मैं इसे दो तरीके से कर सकते हैं. मैं या तो आकार के दो वस्तुओं में पढ़ सकते हैं मेरे inptr से कुत्ता, या मैं पढ़ सकते हैं एक में दो कुत्तों के आकार पर आपत्ति. तो आप देखते हैं कि रास्ते पर निर्भर करता है आप, आप आकार और संख्या की व्यवस्था है कि बैट का यही संख्या में पढ़ सकते हैं. तो अब, चलो बदल सकते हैं हम जरूरत के रूप में पिक्सेल रंग. आप फिर से bmp.h को देखो, तो आप नीचे देखेंगे कि RGBTRIPLEs, एक और संरचना हैं, जहां वे तीन बाइट्स के शामिल हैं. एक, rgbtBlue, rgbtGreen, और rgbtRed. इसलिए इनमें से प्रत्येक राशि का प्रतिनिधित्व करता है नीले रंग की, हरे रंग की राशि, और इस पिक्सेल के अंदर लाल की राशि, जहां प्रत्येक राशि एक द्वारा प्रतिनिधित्व किया है हेक्साडेसिमल संख्या. तो FF0000 एक नीले रंग का हो जाएगा, यह नीले रंग से चला जाता है, क्योंकि लाल करने के लिए, हरे रंग के लिए. और फिर सब च के सफेद हो जाएगा. के smiley.bmp पर एक नज़र, लेते हैं जो आप अपने वितरण कोड में है. आप सिर्फ एक छवि में यह खुला दर्शक, तो आप हूँ सिर्फ एक लाल स्माइली देखें. लेकिन हम करेंगे, में एक गहरी डुबकी ले जा देखना है कि संरचना यह सिर्फ पिक्सल है. हम सफेद पिक्सल है, और फिर लाल पिक्सल. के सभी तो, सफेद FFFFFF, और मैं तुम्हारे लिए रंग में रंग दिया है लाल पिक्सल यहां, और आप वे 0000FF रहे हैं देखते हैं. शून्य नीले, शून्य, हरे और पूर्ण लाल. और स्माइली आठ पिक्सल चौड़ा है के बाद से, हम किसी भी गद्दी नहीं है. ठीक है. मैं विभिन्न मूल्यों आवंटित करने थे तो अगर एक RGBTRIPLE के लिए और मैं चाहता था यह हरे रंग बनाने के लिए, तो मुझे क्या करना होगा है मैं नामित एक RGBTRIPLE, घोषित होगा ट्रिपल, और फिर हर पहुँचने के लिए उस संरचना मैं भीतर बाइट डॉट ऑपरेटर का प्रयोग करेंगे. तो triple.rgbtBlue, मैं कर सकता हूँ 0 तक कि आवंटित. ग्रीन मुझे पूरा करने के लिए आवंटित कर सकते हैं - किसी भी संख्या, वास्तव में, 0 और एफएफ के बीच. और फिर लाल, मैं भी 0 कहने जा रहा हूँ. तो फिर उस ने मुझे एक हरे पिक्सेल देता है. अगला, मैं जाँच करने के लिए क्या चाहते हैं कुछ का मूल्य? मैं जाँच करता है कि कुछ हो सकता है ट्रिपल के rgbtBlue मूल्य है कि क्या एफएफ और फिर प्रिंट, "मैं महसूस कर रहा हूँ नीले! ", एक परिणाम के रूप में. अब, यह जरूरी है कि इसका मतलब यह नहीं पिक्सेल सही, नीला है कि? पिक्सेल की हरी और लाल मूल्यों क्योंकि यह भी गैर 0 मान हो सकता है. इसका मतलब यह है कि सभी, और कहा कि सभी यह है के लिए जाँच कर रहा है एक पूर्ण नीले रंग के लिए. लेकिन सभी पिक्सल भी आंशिक हो सकता था इस तरह रंग मूल्यों, यहां अगले उदाहरण. यह थोड़ा कठिन देखने के लिए है इस छवि अब क्या है. यह थोड़ा और अधिक की तरह दिखता है आप भी दिया जाएगा कि clue.bmp. अब, शारीरिक रूप से, आप इस का समाधान हो सकता है, द्वारा लाल रंग का एक बहुत कुछ है क्योंकि छवि के लिए एक लाल स्क्रीन को पकड़े तो अन्य रंग प्रदर्शित कर सकते हैं. तो हम कैसे ग के साथ इस की नकल करते हैं? खैर, हम सब लाल हटाई जा सकती है छवि से पूरी तरह से. और इसलिए हम हर सेट चाहते हैं कि ऐसा करने के लिए 0 करने के लिए पिक्सेल के लाल मूल्य. और तो छवि एक छोटी सी लग रही होगी हम कोई लाल है, जहां इस तरह, बिट जो भी. हम छिपा संदेश एक देख सकते हैं थोड़ा और अधिक स्पष्ट रूप से अब. यह एक और स्माइली चेहरा है. या हो सकता है कि हम एक और तरीका इस्तेमाल कर सकते हैं. हो सकता है, हम पहचान सकता है लाल पिक्सल के सब - कि, पिक्सल के सभी के साथ है 0 नीला, 0, हरे और 0 लाल - और सफेद करने के लिए उन बदल जाते हैं. और हमारी छवि लग सकता है कुछ इस तरह. देखने के लिए थोड़ा आसान. उजागर करने के लिए अन्य तरीकों के बहुत सारे हैं गुप्त संदेश के रूप में अच्छी तरह से, रंग में गड़बड़ी से निपटने. हो सकता है कि आप एक विधि का उपयोग कर सकते हैं मैंने ऊपर कहा गया है कि. और इसके अलावा, आप चाहते हो सकता है कुछ रंगों को बढ़ाने के लिए और उन बाहर लाने के लिए. तो अब हम पिक्सेल बदल दिया है कि रंग, अगले हम सिर्फ उन्हें लिखने की जरूरत पिक्सेल द्वारा scanline करने में, पिक्सेल. और एक बार फिर, तुम वापस देखना चाहता हूँ आप की नकल नहीं की है, तो copy.c को यह पहले से ही है, और fwrite पर देखने के लिए डेटा लेता समारोह है, जो एक सूचक बाइट्स होता है कि संरचना के लिए आप के आकार से पढ़ रहे हैं कि आइटम, आइटम की संख्या, और फिर outptr - उन फ़ाइलों के गंतव्य. आप पिक्सल में लिखने के बाद, आप हूँ भी गद्दी में लिखने के लिए है. गद्दी क्या है? खैर, हर rgbt पिक्सेल तीन बाइट्स लंबा है. लेकिन, एक बिटमैप छवि के लिए scanline चार बाइट का गुणक हो गया है. और पिक्सेल की संख्या नहीं है अगर एक चार में से कई, तो हम जोड़ने की जरूरत इस गद्दी. गद्दी सिर्फ 0s का प्रतिनिधित्व करती है. तो, हम कैसे लिख सकते हैं, या इस पढ़ा है? खैर, यह पता चला है कि आप नहीं कर सकते हैं कि वास्तव में fread गद्दी, लेकिन आप कर सकते हैं यह गणना. इस मामले में, सुराग और फैसले एक ही चौड़ाई है, तो गद्दी ही है. और padding, जैसा कि आप देखेंगे copy.c में, गणना की है नीचे दिए गए फार्मूले के साथ - bi.biWidth बार sizeof (RGBTRIPLE) होगा कितने बाइट्स बीएमपी हमें दे हर पंक्ति में है. वहाँ से, modulos और subtractions 4 गणना कर सकते हैं साथ कैसे कई बाइट्स जोड़ा जाना है, तो पर बाइट के गुणांकों हर पंक्ति चार है. अब हम के लिए फार्मूला है कि जरूरत है कि हम कितना गद्दी, अब हम यह लिख सकते हैं. अब, मैं पहले उल्लेख किया है, गद्दी सिर्फ 0s है. तो उस मामले में, हम सिर्फ डाल रहे हैं में इस मामले में एक 0 एक चार, हमारे outptr - हमारे outfile. ताकि बस fputc हो सकता है 0, अल्पविराम outptr. तो, हम में पढ़ रहा था, जबकि हमारे फ़ाइल, फ़ाइल i / O का ट्रैक रखा है हमारी कुछ के साथ उन फ़ाइलों में स्थिति फ़ाइल स्थिति सूचक कहा जाता है. एक कर्सर के रूप में सोचो. असल में, यह हर समय अग्रिम हम fread, लेकिन हम है कि भी, इस पर नियंत्रण. फ़ाइल स्थिति सूचक को स्थानांतरित करने के लिए, आप समारोह fseek का उपयोग कर सकते हैं. Inptr फ़ाइल का प्रतिनिधित्व करता है आप में मांग कर रहे हैं कि सूचक, राशि बाइट्स की संख्या है कि आप से तो कर्सर ले जाएँ, और करना चाहते हैं संदर्भ बिंदु से संबंधित है अपने कर्सर है जहां से. आप SEEK_CUR में पारित हो, तो उस वर्तमान का प्रतिनिधित्व करता है फ़ाइल में स्थिति. या फिर आप कुछ अन्य मापदंडों का उपयोग कर सकते हैं. तो, हम छोड़ करने के लिए fseek उपयोग करने के लिए चाहते हो सकता है में फ़ाइल की गद्दी पर. आप फँस रहे हैं और फिर से, वहाँ copy.c. में इस बात का एक उदाहरण तो अब हम फ़ाइल खोल दिया है, सुराग और फैसले. हम करने के लिए हैडर जानकारी अपडेट कर दिया है हमारे फैसले, क्योंकि हर बिटमैप एक शीर्ष लेख की जरूरत है. हम तो सुराग के रूप में पढ़ा है scanline, पिक्सेल द्वारा पिक्सेल, बदलते हर रंग के रूप में आवश्यक है, और में उन लेखन फैसले, पिक्सेल द्वारा पिक्सेल. आप फैसले खोल लेते हैं, जैसा कि आप देख सकते हैं जो अपराधी, या क्या रहस्य संदेश है. मेरा नाम Zamyla है, और इस whodunit था.