[เล่นดนตรี] ZAMYLA จัน: มันเป็นนางสาวคาร์เลตต์ ด้วยเชิงเทียน สืบสวนสอบสวน? ดีที่เรากำลังจะไปหา ในแย้มเกมกระดานคุณอาจ ได้รับภาพสีแดงทางกายภาพ และภาพที่มีสีแดงมากและ เป็นจุด ๆ และงานของคุณคือการ เผยให้เห็นข้อความที่ซ่อนอยู่ และมักจะคุณจะให้มาพร้อมกับสีแดง แว่นขยายหรือหน้าจอสีแดง เผยให้เห็นข้อความที่ซ่อนอยู่ที่ ดีที่เรากำลังจะเลียนแบบที่ ในสืบสวนสอบสวน, คุณได้รับภาพบิตแมป ที่มีลักษณะเป็นจุด ๆ มากและสีแดง และเรียกใช้โปรแกรมสืบสวนสอบสวน เพื่อเผยให้เห็นข้อความที่ซ่อนอยู่ จึงขอแบ่งนี้เป็นขั้นตอน ขั้นแรกคุณต้องการเปิดแฟ้ม - เบาะแสที่คุณได้รับ แล้วยังสร้าง แฟ้มคำตัดสินบิตแมป แล้วคุณต้องการที่จะปรับปรุงบิตแมป ส่วนหัวข้อมูลการ OUTFILE คำตัดสิน เพิ่มเติมว่าภายหลัง แล้วคุณจะได้อ่านใน เงื่อนงำ scanline พิกเซลโดยพิกเซล เปลี่ยนสีพิกเซลเป็น ที่จำเป็นและการเขียน ที่เป็นคำตัดสินของศาล - พิกเซลพิกเซลเป็น คำตัดสิน scanline เราจะเริ่มต้นที่จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร ดีโชคดีที่เรามี copy.c ในรหัสการกระจาย และนี้จะพิสูจน์ ค่อนข้างมีประโยชน์กับเรา Copy.c เปิดแฟ้ม, อ่านในที่ INFILE ของส่วนหัวแล้วปรับปรุง ส่วนหัวของ OUTFILE แล้วก็อ่านในแต่ละพิกเซล scanline พิกเซลพิกเซลแล้ว เขียนพิกเซลที่เป็น OUTFILE ดังนั้นขั้นตอนแรกของคุณอาจ จะทำงานต่อไป คำสั่งใน terminal - cp copy.c whodunit.c นี้จะสร้างสำเนาของ copy.c ชื่อ whodunit.c ดังนั้นขั้นตอนแรกของเราที่จะเปิด ไฟล์ดีมีแน่นอน แบบจำลองที่อยู่ใน copy.c. ดังนั้นฉันจะปล่อยให้คุณมองไปที่ว่า สิ่งที่เรากำลังติดต่อกับใน pset นี้ ไฟล์ I / O โดยทั่วไปการไฟล์ การอ่านการเขียนการแก้ไขพวกเขา วิธีการทำที่คุณเปิดแฟ้มแรก ดีที่คุณกำลังจะประกาศแฟ้ม ตัวชี้แล้วคุณโทร fopen ฟังก์ชั่น ผ่านในเส้นทางหรือชื่อของว่า ยื่นแล้วโหมดที่คุณต้องการ จะเปิดแฟ้มที่ค่ะ ผ่านใน r จะเปิด foo.bmp สำหรับการอ่าน ในขณะที่มี fopen ผ่านในน้ำหนักจะ bar.bmp เปิดสำหรับการเขียนไฟล์และ การแก้ไขก็จริง ดังนั้นขณะนี้ที่เราได้เปิดไฟล์ของเรา ขั้นตอนต่อไปคือการปรับปรุงข้อมูลส่วนหัว เพื่อ OUTFILE สิ่งที่ข้อมูลส่วนหัวหรือไม่ ดีแรกที่เราจำเป็นต้องรู้ สิ่งที่เป็นบิตแมป บิตแมปเป็นเพียงง่าย การจัดเรียงของไบต์ และพวกเขากำลังประกาศในแฟ้มนี้ ที่นี่ bmp.h, มีพวงของ ข้อมูลของสิ่งที่บิตแมป จะทำจริงออกจาก แต่สิ่งที่เราจริงๆดูแลเกี่ยวกับการเป็น ส่วนหัวของแฟ้มบิตแมปที่นี่และ ส่วนหัวของข้อมูลบิตแมปที่นี่ ส่วนหัวที่ประกอบด้วยคู่ของ ตัวแปรที่จะพิสูจน์ว่ามีประโยชน์มาก มี biSizeImage ซึ่งเป็นเป็น ขนาดของภาพเป็นไบต์ และรวมถึงพิกเซลและช่องว่างภายใน padding เป็นสิ่งที่สำคัญมาก แต่ เราจะให้ในภายหลังว่า BiWidth แสดงให้เห็นถึงความกว้างของ ภาพในพิกเซลลบช่องว่างภายใน BiHeight แล้วยังเป็นความสูง ของภาพเป็นพิกเซล แล้ว BITMAPFILEHEADER และ BITMAPINFOHEADER ที่ผมกล่าวถึง ก่อนหน้านี้ผู้ที่จะเป็นตัวแทนของ เป็น structs ดังนั้นคุณไม่สามารถเข้าถึงส่วนหัวของแฟ้ม ตัวเอง แต่คุณจะต้องการที่จะได้รับการ ตัวแปรเหล่านั้นภายใน ตกลง ดังนั้นทำอย่างไรเราปรับปรุงข้อมูลส่วนหัวหรือไม่ ดีแรกที่เราต้องดูว่าเรา จำเป็นต้องเปลี่ยนข้อมูลใด ๆ จาก INFILE เบาะแสเพื่อ OUTFILE, คำตัดสิน มีอะไรที่เปลี่ยนแปลงในกรณีนี้ ดีไม่จริงเพราะเรากำลังจะ ที่จะเพียงแค่เปลี่ยนสี เราไม่ได้จะได้รับการเปลี่ยนไฟล์ ขนาดขนาดภาพกว้าง หรือความสูง ดังนั้นคุณขวาทั้งหมดในขณะนี้โดย เพียงแค่คัดลอกแต่ละพิกเซล ตกลง ดังนั้นตอนนี้ให้ดูที่วิธีการที่เราจริง สามารถอ่านทุกพิกเซลจากไฟล์ ไฟล์อื่น I / O ฟังก์ชั่น จะเข้ามาเล่น - fread ก็จะใช้เวลาในการชี้ไปยัง struct ที่จะมีไบต์ที่ ที่คุณกำลังอ่าน ดังนั้นที่คุณกำลังอ่านในที่ แล้วคุณจะผ่านในขนาดซึ่งเป็น ขนาดของทุกองค์ประกอบที่คุณ ต้องการอ่าน ที่นี่ sizeof ฟังก์ชั่น จะมาในสะดวก แล้วคุณจะผ่านในจำนวนที่ แสดงให้เห็นถึงจำนวนขององค์ประกอบของ ขนาดที่จะอ่าน และแล้วในที่สุด inptr ซึ่งเป็น ตัวชี้แฟ้มที่คุณ จะอ่านจาก ดังนั้นทั้งหมดขององค์ประกอบที่มีอยู่ภายใน inptr และพวกเขากำลังจะข้อมูล ลองดูที่เป็นตัวอย่างเล็ก ๆ น้อย ๆ ถ้าผมต้องการที่จะอ่านเป็นข้อมูลสองสุนัข ดีฉันสามารถทำมันได้อย่างใดอย่างหนึ่งในสองวิธี ฉันสามารถอ่านได้ทั้งในสองวัตถุที่มีขนาด สุนัขจาก inptr ฉันหรือฉันสามารถอ่าน หนึ่งในวัตถุขนาดของสุนัขสองตัว ดังนั้นคุณจะเห็นว่าขึ้นอยู่กับวิธีที่ ที่คุณจัดขนาดและจำนวนคุณ สามารถอ่านได้ในจำนวนเดียวกันของไบต์ ดังนั้นตอนนี้ขอเปลี่ยน สีพิกเซลในขณะที่เราต้องการ ถ้าคุณดูที่ bmp.h อีกครั้งแล้ว คุณจะเห็นว่าที่ด้านล่าง RGBTRIPLEs เป็นโครงสร้างอื่นที่ พวกเขาจะประกอบด้วยสามไบต์ หนึ่ง rgbtBlue, rgbtGreen และ rgbtRed ดังนั้นแต่ละเหล่านี้แสดงให้เห็นถึงจำนวนเงินที่ สีฟ้าปริมาณของสีเขียวและ ปริมาณของสีแดงในภาพนี้ที่ แต่ละจำนวนเงินที่เป็นตัวแทนจาก เลขฐานสิบหก ดังนั้น ff0000 จะเป็นสีฟ้า เพราะมันจะไปจากสีฟ้า เป็นสีเขียวเป็นสีแดง และแล้วสิ่งที่เอฟจะเป็นสีขาว ลองมาดูที่ smiley.bmp ซึ่ง ที่คุณมีในรหัสการกระจายของคุณ ถ้าคุณเปิดได้ในเพียงภาพ ดูแล้วคุณจะ เพียงแค่เห็นยิ้มสีแดง แต่การดำน้ำลึกลงไปในเราจะ เห็นว่าโครงสร้าง มันเป็นเพียงพิกเซล เรามีพิกเซลสีขาว แล้วพิกเซลสีแดง สีขาว FFFFFF และแล้วทั้งหมดของ พิกเซลสีแดงผมสีในสำหรับคุณ ที่นี่และคุณจะเห็นว่าพวกเขากำลัง 0000ff ศูนย์สีฟ้า, สีเขียวเป็นศูนย์และเต็มไปด้วยสีแดง และตั้งแต่ยิ้มแปดพิกเซลกว้าง เราไม่ได้มีช่องว่างใด ๆ ขวาทั้งหมด ดังนั้นถ้าผมจะกำหนดค่าที่แตกต่างกัน การ RGBTRIPLE และฉันต้องการ ทำให้มันเป็นสีเขียวแล้วสิ่งที่ผมจะทำคือ ฉันจะประกาศ RGBTRIPLE ชื่อ สามแล้วในการเข้าถึงทุก ไบต์ภายใน struct ที่ฉัน จะใช้ประกอบจุด ดังนั้น triple.rgbtBlue ฉันสามารถ ที่กำหนดให้เป็น 0 สีเขียวที่ฉันสามารถกำหนดให้เต็ม - ใด ๆ จำนวนจริงๆระหว่าง 0 และ ff และสีแดงแล้วผมยังจะบอกว่า 0 ดังนั้นแล้วที่ทำให้ผมพิกเซลสีเขียว ถัดไปสิ่งที่ถ้าผมต้องการที่จะตรวจสอบ ค่าของอะไร ฉันอาจมีบางสิ่งบางอย่างที่จะตรวจสอบ ไม่ว่าจะเป็นสามของค่า rgbtBlue เป็น ff แล้วพิมพ์ "ฉันรู้สึก สีฟ้า "เป็นผลให้ ตอนนี้ที่ไม่ได้หมายความว่า พิกเซลที่เป็นสีฟ้าใช่ไหม เนื่องจากค่าส​​ีเขียวและสีแดงของพิกเซล นอกจากนี้ยังอาจมีไม่ 0 ค่า สิ่งที่หมายถึงนี้และทุกสิ่งที่ นี้ได้รับการตรวจสอบเป็น เพื่อสีฟ้าเต็ม แต่ทุกพิกเซลนอกจากนี้ยังอาจมีบางส่วน ค่าสีเช่นนี้ ตัวอย่างต่อไปที่นี่ มันเป็นเพียงเล็กน้อยยากที่จะเห็น ว่าภาพนี้เป็นตอนนี้ นี้ดูนิด ๆ หน่อย ๆ เช่น clue.bmp ที่คุณจะได้รับ ตอนนี้ร่างกายคุณอาจแก้ปัญหานี้ เพราะมีจำนวนมากของสีแดงโดยเป็น ถือขึ้นหน้าจอสีแดงไปที่ภาพเพื่อ ว่าสีอื่น ๆ สามารถปรากฏ ดังนั้นทำอย่างไรเราเลียนแบบนี้กับ c? ดีเราอาจจะเอาสีแดงทั้งหมด จากภาพทั้งหมด ดังนั้นจะทำอย่างไรที่เราจะกำหนดทุก พิกเซลค่าสีแดง 0 และอื่น ๆ ภาพจะดูน้อย บิตเช่นนี้ที่เราไม่มีสีแดง ใด ๆ เราสามารถมองเห็นข้อความที่ซ่อนอยู่ นิด ๆ หน่อย ๆ อย่างเห็นได้ชัดมากขึ้นในขณะนี้ มันเป็นใบหน้าที่ยิ้มอีก หรือบางทีเราอาจจะใช้วิธีอื่น บางทีเราสามารถระบุ ทั้งหมดของพิกเซลสีแดง - นั่นคือทั้งหมดของพิกเซลที่มี 0 สีฟ้า, 0 สีเขียวและสีแดง 0 - และการเปลี่ยนแปลงเหล่านั้นเป็นสีขาว และภาพของเราอาจมีลักษณะ บางอย่างเช่นนี้ นิด ๆ หน่อย ๆ ง่ายต่อการดู มีหลายวิธีอื่น ๆ ที่จะค้นพบเป็น ข้อความลับเช่นกัน ที่เกี่ยวข้องกับการจัดการสี บางทีคุณอาจจะใช้วิธีใดวิธีหนึ่ง ที่ผมกล่าวข้างต้น และนอกจากนี้คุณอาจต้องการ เพื่อเพิ่มบางสี และนำผู้ที่ออก ดังนั้นขณะนี้ที่เราได้เปลี่ยนพิกเซล สีต่อไปเราก็ต้องเขียนไว้ ใน scanline พิกเซลพิกเซล และอีกครั้งที่คุณจะต้องการที่จะมองย้อนกลับไป การ copy.c ถ้าคุณยังไม่ได้คัดลอก มันอยู่แล้วและดูที่ fwrite ฟังก์ชั่นซึ่งจะนำข้อมูลตัวชี้ เพื่อ struct ที่มีไบต์ ที่คุณกำลังอ่านจากขนาดของ รายการจำนวนรายการ แล้ว outptr - ปลายทางไฟล์เหล่านั้น หลังจากที่คุณเขียนในพิกเซลคุณจะ นอกจากนี้ยังมีการเขียนในช่องว่างภายใน padding คืออะไร ดีทุกพิกเซล rgbt สามไบต์ยาว แต่ scanline ภาพบิตแมป จะต้องมีหลายสี่ไบต์ และถ้าจำนวนพิกเซลไม่ได้เป็น หลายสี่แล้วเราต้องเพิ่ม padding นี้ padding เป็นตัวแทนเพียงแค่ 0s ดังนั้นวิธีที่เราเขียนหรืออ่านนี้ ดีก็ปรากฎว่าคุณไม่สามารถ padding fread จริง แต่คุณสามารถ คำนวณมัน ในกรณีนี้เบาะแสและคำตัดสิน มีความกว้างเท่ากันดังนั้น padding จะเหมือนกัน และช่องว่างภายในที่คุณจะเห็น ใน copy.c, มีการคำนวณ ด้วยสูตรด้านล่าง - ครั้ง bi.biWidth sizeof (RGBTRIPLE) จะ ให้เรากี่ไบต์, bmp มีอยู่ในทุกแถว จากนั้น Modulos และ subtractions 4 สามารถคำนวณ ไบต์จำนวนมากต้องมีการเพิ่มเพื่อให้ หลายไบต์ใน ทุกแถวสี่ ตอนนี้เรามีสูตรสำหรับ วิธีการขยายมากที่เราต้องการในขณะนี้ เราสามารถเขียนมัน ตอนนี้ผมได้กล่าวมาก่อน padding เป็นเพียง 0s ดังนั้นในกรณีที่เราเพียงแค่ใส่ ถ่านในกรณีนี้ 0 เป็นของเรา outptr - OUTFILE ของเรา ดังนั้นก็สามารถ fputc 0 จุลภาค outptr ดังนั้นในขณะที่เราได้รับการอ่านเป็นของเรา ไฟล์ไฟล์ I / O ได้เฝ้าติดตามของเรา ตำแหน่งในไฟล์เหล่านั้นกับสิ่งที่ ที่เรียกว่าตัวบ่งชี้ตำแหน่งไฟล์ คิดว่ามันเป็นเคอร์เซอร์ โดยทั่วไปจะก้าวหน้าทุกครั้ง ที่เรา fread แต่เรามี ควบคุมมันเกินไป เมื่อต้องการย้ายตัวบ่งชี้ตำแหน่งไฟล์ คุณสามารถใช้ฟังก์ชัน fseek ที่ inptr แสดงไฟล์ ตัวชี้ที่คุณกำลังมองหาใน จำนวนเงินที่เป็นจำนวนไบต์ที่คุณ ต้องการที่จะเลื่อนเคอร์เซอร์ไปแล้วจาก ที่เกี่ยวข้องกับจุดอ้างอิง จากที่เคอร์เซอร์ของคุณเป็น ถ้าคุณผ่านใน SEEK_CUR ที่ แสดงให้เห็นถึงปัจจุบัน ตำแหน่งในแฟ้ม หรือคุณสามารถใช้บางพารามิเตอร์อื่น ๆ ดังนั้นเราอาจต้องการใช้ fseek ที่จะข้าม ผ่านการขยายของไฟล์ใน และอีกครั้งถ้าคุณกำลังติดมี ตัวอย่างที่อยู่ใน copy.c. ดังนั้นตอนนี้เราได้เปิดไฟล์ เบาะแสและคำตัดสิน เราได้ปรับปรุงข้อมูลส่วนหัวสำหรับ คำตัดสินของเราเพราะทุก บิตแมปความต้องการของส่วนหัว เราได้อ่านแล้วเป็นเบาะแสของ scanline พิกเซลพิกเซลเปลี่ยน ทุกสีเท่าที่จำเป็นและ การเขียนที่เป็น คำตัดสินพิกเซลพิกเซล เมื่อคุณเปิดคำตัดสินคุณสามารถดูว่าใคร ผู้กระทำผิดได้หรือสิ่งที่เป็นความลับ ข้อความเป็น ชื่อของฉันคือ Zamyla และ นี้คือการสืบสวนสอบสวน