>> [เล่นดนตรี]
>> 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 และ นี้คือการสืบสวนสอบสวน