[MUSIC پخش] ZAMYLA CHAN: این خانم اسکارلت بود با شمعی. رمان پلیسی؟ خوب، ما قصد داریم برای پیدا کردن. در بازی تخته گوی، شما ممکن است یک تصویر قرمز فیزیکی داده می شود. و این تصویر بسیار قرمز و است پر از لکه، و کار خود را به نشان می دهد که پیام های پنهان است. و معمولا شما با رنگ قرمز ارائه ذره بین، و یا یک صفحه نمایش قرمز رنگ به نشان می دهد که پیام های پنهان است. خوب، ما قصد داریم به تقلید که. در رمان پلیسی، شما یک تصویر بیت مپ داده شده در حال که به نظر می رسد بسیار پر از لکه و قرمز، و پس از آن اجرای برنامه رمان پلیسی به فاش کردن یک پیام پنهان است. بنابراین اجازه دهید این شکستن به گام. اول، شما می خواهید برای باز کردن فایل - سرنخ که به شما داده شده است. و پس از آن نیز ایجاد فایل بیت مپ حکم. پس از آن شما می خواهید برای به روز رسانی بیت مپ هدر اطلاعات outfile حکم. بیشتر در مورد که بعد از آن. و پس از آن شما به عنوان خوانده شده به سرنخ، scanline پیکسل به پیکسل، تغییر رنگ پیکسل به عنوان لازم است، و نوشتن کسانی که به حکم - پیکسل به پیکسل به scanline حکم. چگونه می توانم شروع خواهیم در مورد این؟ خوب، خوشبختانه، ما copy.c در کد توزیع. و این است که برای اثبات به ما بسیار مفید است. Copy.c یک فایل باز می شود، بار خوانده شده در آن هدر INFILE، و پس از آن به روز رسانی هدر outfile است. و سپس آن را بار خوانده شده هر پیکسل در scanline پیکسل به پیکسل، و پس از آن که پیکسل می نویسد: به outfile. بنابراین، اولین گام شما ممکن است لازم است برای اجرای زیر دستور در ترمینال - CP copy.c whodunit.c. با این کار یک کپی از ایجاد copy.c نام whodunit.c. بنابراین اولین قدم ما برای باز کردن فایل، خوب، دقیق آن وجود دارد ماکت که در copy.c. بنابراین من شما را به در آن نگاه کنید. آنچه ما با خرید و فروش در این PSET است فایل I / O، اساسا فایل های مصرف، خواندن، نوشتن، ویرایش آنها. چگونه برای بار اول شما یک فایل را باز کنید؟ خوب، شما به اعلام یک فایل اشاره گر، و پس از آن با شما تماس fopen عملکرد. رفتن به راه، و یا نام آن فایل، و پس از آن حالت که شما می خواهید برای باز کردن آن فایل شوید پس از گذشت در تحقیق باز خواهد شد foo.bmp برای خواندن. در حالی که fopen با عبور در عرض خواهد شد bar.bmp باز، برای نوشتن فایل و در واقع در حال ویرایش آن. بنابراین در حال حاضر که ما فایل را باز کرده ایم، ما گام بعدی این است برای به روز رسانی اطلاعات هدر برای outfile. اطلاعات هدر چیست؟ خب، اول ما نیاز به دانستن آنچه که یک بیت مپ است. بیت مپ فقط ساده است ترتیب بایت. و آنها در این فایل اعلام کرد در اینجا، bmp.h، با یک دسته از اطلاعات از یک بیت مپ است که در واقع از ساخته شده است. اما چیزی که ما واقعا در مورد مراقبت است هدر فایل بیت مپ، حق در اینجا، و بیت مپ هدر اطلاعات، بیش از اینجا. هدر از یک زن و شوهر از تشکیل متغیرهایی که ثابت خواهد کرد که بسیار مفید است. است biSizeImage است که وجود دارد اندازه کل تصویر را در بایت. و این شامل پیکسل و پد. عمل توسعه بسیار مهم است، اما ما به که بعد دریافت کنید. BiWidth نشان دهنده عرض تصویر در پیکسل منهای پد. BiHeight است پس از آن نیز ارتفاع از تصویر در پیکسل. و پس از آن BITMAPFILEHEADER و BITMAPINFOHEADER، به عنوان ذکر من قبل از آن، آن ها نشان داده به عنوان ساختار. بنابراین، شما می توانید هدر فایل دسترسی پیدا کنید خود را، اما شما می خواهید برای دریافت به آن متغیر در داخل. OK. پس چگونه می توانم اطلاعات هدر را به روز کنیم؟ خوب، در ابتدا ما باید ببینیم که آیا ما نیاز به تغییر هر گونه اطلاعات از INFILE، نشانه، به outfile، حکم. آیا هر چیزی در حال تغییر است در این مورد؟ خوب، در واقع، از آنجا که ما در حال رفتن می شود فقط به تغییر رنگ. ما قصد داریم به تغییر فایل اندازه، اندازه تصویر، عرض، و یا ارتفاع. بنابراین شما همه حق در حال حاضر توسط هستی فقط کپی کردن هر پیکسل است. OK. بنابراین در حال حاضر اجازه دهید که چگونه ما در واقع نگاه می تواند هر پیکسل از فایل خوانده شوند. فایل یکی دیگر از I / O عملکرد را به بازی آمد - از fread. آن را در یک اشاره گر را به ساختار که کلمه در ادامه متن شامل است که شما در حال خواندن. بنابراین شما در حال خواندن به آن. و سپس شما را در یک اندازه پاس، که به اندازه هر عنصر که شما می خواهم به عنوان خوانده شده. در اینجا، sizeof تابع در مفید آمده است. سپس شما را در تعداد پاس، که نشان دهنده تعداد عناصر اندازه به عنوان خوانده شده. و سپس در نهایت، inptr، که است اشاره گر فایل که شما رفتن به خواندن. بنابراین تمام عناصر در داخل inptr و آنها در حال رفتن به اطلاعات. بیایید نگاهی به یک نمونه کوچک نگاه کنید. اگر من می خواهم به عنوان خوانده شده را به داده های دو سگ، خوب، من می توانم این کار را انجام یکی از دو راه. من هم می تواند در دو جسم از اندازه به عنوان خوانده شده سگ از inptr من، یا من می توانم به عنوان خوانده شده در یک شی به اندازه دو سگ. پس می بینید که بسته به راه که شما ترتیب اندازه و تعداد، شما می تواند در به همان تعداد از بایت به عنوان خوانده شده. بنابراین در حال حاضر، اجازه دهید تغییر رنگ پیکسل به ما نیاز داریم. اگر شما در bmp.h دوباره نگاه کنید، سپس شما خواهید دید که در پایین RGBTRIPLEs است ساختار دیگر، که در آن آنها از سه بایت تشکیل شده است. یک، rgbtBlue، rgbtGreen، و rgbtRed. بنابراین هر یک از این نشان دهنده میزان از آبی، مقدار رنگ سبز، و میزان رنگ قرمز در داخل این پیکسل، که در آن هر مقدار توسط یک نشان داده شده است تعداد هگزادسیمال. بنابراین FF0000 خواهد بود به رنگ آبی، چرا که آن را از آبی می رود، به سبز، به رنگ قرمز. و پس از آن همه F را سفید خواهد بود. اجازه دهید نگاهی به smiley.bmp، که شما در کد توزیع خود را داشته باشد. اگر شما آن را باز کنید فقط در یک تصویر بیننده، سپس شما فقط یک لبخند قرمز را ببینید. اما گرفتن یک شیرجه عمیق تر در، ما می بینیم که ساختار از آن است که فقط پیکسل است. ما پیکسل های سفید، و سپس پیکسل های قرمز. سفید، FFFFFF، و سپس همه پیکسل های قرمز من برای شما در رنگی ام در اینجا، و شما می بینید که آنها 0000ff است. صفر آبی، صفر سبز و قرمز پر. و از آنجایی که حرکت هشت پیکسل گسترده ای است، ما هیچ بالشتک ندارد. بسیار خوب. بنابراین اگر من به اختصاص دادن مقادیر مختلف به RGBTRIPLE و من می خواستم آن را سبز، پس از آن چه من می خواهم انجام دهید این است من یک RGBTRIPLE، به نام اعلان سه گانه، و پس از آن برای دسترسی به هر بایت است که در آن ساختار I می عملگر نقطه استفاده کنید. بنابراین triple.rgbtBlue، من می توانم اختصاص که به 0. سبز من می توانم آن را به کامل اختصاص دهید - هر شماره، واقعا، بین 0 و FF. و سپس قرمز، من هم رفتن به می گویند 0. بنابراین پس از آن که به من می دهد یک پیکسل سبز. بعد، اگر من می خواهم برای بررسی ارزش چیزی است؟ من می توانم چیزی که چک کرده اند آیا ارزش rgbtBlue سه گانه است به بعد و پس از چاپ، "من احساس آبی! "، به عنوان یک نتیجه. در حال حاضر، این لزوما به این معنی نیست که پیکسل آبی است، درست است؟ از آنجا که ارزش های سبز و قرمز پیکسل همچنین می تواند غیر 0 ارزش داشته باشد. اکنون که این بدان معنی است، و آنچه را که این است که برای چک کردن است برای پر رنگ آبی. اما تمام پیکسل نیز می تواند جزئی دارند مقدار رنگ، مثل این مثال بعدی در اینجا. این کمی سخت تر برای دیدن آنچه در این تصویر می باشد در حال حاضر. این به نظر می رسد کمی بیشتر شبیه به clue.bmp که شما داده شود. در حال حاضر، از لحاظ جسمی، شما ممکن است این را حل کند، چرا که در بسیاری از رنگ های قرمز، توسط وجود دارد برگزاری یک صفحه نمایش قرمز رنگ به تصویر تا که رنگ های دیگر را می توانید ظاهر می شود. پس چگونه ما این تقلید با ج؟ خب، ما ممکن است تمام قرمز حذف از تصویر به طور کامل. و به این ترتیب به انجام این کار ما می خواهم هر مجموعه مقدار قرمز پیکسل به 0. و به این ترتیب تصویر را کمی نگاه کمی شبیه به این، که در آن ما هیچ قرمز آنچه. ما می توانیم پیام های مخفی را ببینید کمی بیشتر به وضوح در حال حاضر. این یکی دیگر از چهره لبخند است. یا شاید ما می تواند روش دیگری استفاده کنید. شاید، ما می تواند شناسایی تمام پیکسل های قرمز - که شده است، همه از پیکسل با 0 آبی، 0 سبز و قرمز 0 - و تغییر آن به رنگ سفید. و تصویر ما ممکن است نگاه چیزی شبیه به این. یک کمی آسان تر برای دیدن. هستند بسیاری از راه های دیگر برای کشف وجود دارد پیام های مخفی نیز هست، برخورد با دستکاری رنگ. شاید شما ممکن است یکی از روش های استفاده که من در بالا ذکر شد. و علاوه بر این، شما ممکن است بخواهید به منظور افزایش برخی از رنگ ها و آوردن آن است. بنابراین در حال حاضر که ما پیکسل تغییر داده اید رنگ، در کنار ما فقط باید آنها را به ارسال در به scanline پیکسل به پیکسل. و با این حال باز هم، شما می خواهید به نگاه به copy.c، اگر شما کپی نمی کند در حال حاضر، و نگاه در fwrite تابع، که طول می کشد داده ها، یک اشاره گر به ساختار که شامل کلمه در ادامه متن که شما را از، به اندازه خواندن اقلام، تعداد اقلام، و پس از آن outptr - مقصد از این فایل ها. پس از شما در پیکسل ارسال، نظر شما همچنین باید ارسال در بالشتک. پد چیست؟ خوب، هر پیکسل rgbt سه کلمه در ادامه متن طولانی است. اما، scanline برای یک تصویر بیت مپ باید مضربی از چهار بایت. و اگر تعداد پیکسل ها نمی باشد. چند چهار، پس ما نیاز به اضافه کردن این لایه. عمل توسعه دادن فقط با 0s و نشان داده شده است. بنابراین، چگونه ارسال می کنیم، و یا خواندن این؟ خب، معلوم است که شما می توانید نیست پد در واقع از fread، اما شما می توانید محاسبه آن است. در این مورد، نشانه و حکم دارای عرض یکسان، به طوری که لایه همان است. و بالشتک، که شما خواهید دید در copy.c، محاسبه شده است با استفاده از فرمول زیر - بار bi.biWidth sizeof (RGBTRIPLE) خواهد شد چند بایت bmp و ما را است در هر سطر. از آنجا، modulos و کسورات با 4 می تواند محاسبه بسیاری از بایت باید اضافه شود، به طوری که چند کلمه در ادامه متن در در هر سطر چهار است. حالا که ما می توانیم فرمول برای چه مقدار از بالشتک نیاز ما، در حال حاضر ما می توانیم آن را بنویسید. در حال حاضر، که اشاره کردم، پد فقط 0s و است. پس در آن صورت، ما فقط قرار دادن کاراکتر، در این مورد 0، به ما outptr - outfile ما. به طوری که فقط می توانید fputc است 0، کاما outptr. بنابراین، در حالی که ما شده ایم به خواندن ما فایل، فایل I / O مسیر نگه داشته ما موقعیت در آن فایل های با چیزی به نام شاخص موقعیت فایل. فکر می کنم از آن به عنوان یک مکان نما. در واقع، این پیشرفت در هر زمان که ما از fread، اما ما کنترل بیش از آن، بیش از حد. برای حرکت نشانگر موقعیت فایل، شما می توانید fseek تابع استفاده کنید. که در آن inptr نشان دهنده فایل اشاره گر است که شما به دنبال در، مقدار تعداد بایت است که شما می خواهم به حرکت مکان نما، و سپس از مربوط به نقطه مرجع از جایی که اشاره گر خود را است. اگر شما در SEEK_CUR عبور کند، که نشان دهنده فعلی موقعیت در فایل. یا شما می توانید برخی از پارامترهای دیگر استفاده کنید. بنابراین، ما ممکن است مایل به استفاده از fseek به جست و خیز بر روی پد از فایل در. و دوباره، اگر شما گیر کرده وجود دارد، یک نمونه از آن در copy.c. بنابراین در حال حاضر ما فایل را باز کرده ام، نشانه، و حکم. ما اطلاعات هدر برای به روز رسانی کرده ام حکم ما، زیرا هر بیت مپ نیاز به یک ضربه سر. پس از آن ما را به نشانه خوانده ام scanline، پیکسل به پیکسل تغییر هر رنگ به عنوان لازم و نوشتن آن را به حکم پیکسل به پیکسل. هنگامی که شما حکم باز کردن، شما می توانید ببینید که چه کسی مقصر، و یا چه راز پیام است. نام من Zamyla است، و این رمان پلیسی بود.