1 00:00:00,000 --> 00:00:10,210 >> [เล่นดนตรี] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA จัน: ระเบิด Let 's สิ่งที่ขึ้นอยู่กับการปรับขนาด 3 00:00:13,320 --> 00:00:17,710 ในการปรับขนาดที่ผู้ใช้จะผ่านในการผ่านทาง บรรทัดคำสั่งภาพบิตแมปที่ 4 00:00:17,710 --> 00:00:21,860 พวกเขาต้องการให้คุณวัดจากจำนวน ว่าพวกเขายังผ่านใน 5 00:00:21,860 --> 00:00:23,770 ในบรรทัดคำสั่ง 6 00:00:23,770 --> 00:00:24,690 เราจะทำอย่างไร 7 00:00:24,690 --> 00:00:28,270 >> ดีสิ่งแรกแรกให้ พักนี้ลงเป็นขั้นตอน 8 00:00:28,270 --> 00:00:31,510 คุณจะต้องการเปิด INFILE ที่พวกเขาให้เป็น 9 00:00:31,510 --> 00:00:35,560 สร้างและเปิด OUTFILE ที่ คุณกำลังจะใส่ 10 00:00:35,560 --> 00:00:38,020 ปรับขนาดภาพค่ะ 11 00:00:38,020 --> 00:00:42,050 แล้วเพราะคุณปรับขนาดและ เพราะมันเป็นบิตแมปก็ส่วนหัวดังนั้น 12 00:00:42,050 --> 00:00:46,080 คุณจะยังปรับปรุงส่วนหัว ข้อมูล OUTFILE, 13 00:00:46,080 --> 00:00:47,950 และเขียนว่าค่ะ 14 00:00:47,950 --> 00:00:51,850 จากนั้นคุณจะได้อ่านใน scanline ของ INFILE, 15 00:00:51,850 --> 00:00:56,890 พิกเซลโดยพิกเซลปรับขนาดในแนวนอน และการเขียนที่เป็นพิกเซล 16 00:00:56,890 --> 00:01:00,910 OUTFILE ตามที่ระบุไว้ โดยขนาดของผู้ใช้ 17 00:01:00,910 --> 00:01:03,940 >> คุณจะจำ เพิ่มขยายได้ตามความจำเป็น 18 00:01:03,940 --> 00:01:05,400 เพิ่มเติมว่าภายหลัง 19 00:01:05,400 --> 00:01:07,790 แล้วก็ปรับขนาดในแนวตั้ง 20 00:01:07,790 --> 00:01:08,890 ตกลง 21 00:01:08,890 --> 00:01:13,280 ดังนั้นนี่เป็นไปได้นิด ๆ หน่อย ๆ ซับซ้อนกว่าใครทำมัน แต่ 22 00:01:13,280 --> 00:01:18,310 สิ่งที่คล้ายกันคือ copy.c ที่จะ อีกครั้งพิสูจน์ว่ามีประโยชน์มาก 23 00:01:18,310 --> 00:01:23,160 โปรดจำไว้ว่า copy.c เปิดไฟล์ ปรับปรุงข้อมูลส่วนหัวสำหรับ 24 00:01:23,160 --> 00:01:28,250 OUTFILE แล้วอ่านเป็น scanline, พิกเซลโดยพิกเซลเขียนทุกพิกเซล 25 00:01:28,250 --> 00:01:30,510 เป็น scanline ไฟล์ที่ส่งออกของ 26 00:01:30,510 --> 00:01:37,040 >> ดังนั้นอีกครั้งขั้นตอนแรกของคุณอาจจะเป็น จะ cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 ในไดเรกทอรี PSET5 ของคุณ 28 00:01:40,560 --> 00:01:43,920 จำไว้ว่าก่อนที่คุณจะคัดลอก เพื่อให้แน่ใจว่าคุณเข้าใจ 29 00:01:43,920 --> 00:01:46,600 copy.c อย่างละเอียด 30 00:01:46,600 --> 00:01:47,620 ตกลง 31 00:01:47,620 --> 00:01:49,880 >> จึงขอเปิดแฟ้ม 32 00:01:49,880 --> 00:01:50,870 คุณจะรู้ว่าวิธีการทำที่ 33 00:01:50,870 --> 00:01:52,600 ฉันจะออกจากที่อยู่กับคุณ 34 00:01:52,600 --> 00:01:56,050 ถัดไปปรับปรุงข้อมูลส่วนหัว เพื่อ OUTFILE 35 00:01:56,050 --> 00:01:59,240 เพราะเรามีบิตแมปใหม่ เรามีข้อมูลส่วนหัวใหม่ 36 00:01:59,240 --> 00:02:00,970 มีการเปลี่ยนแปลงอะไรที่นี่ 37 00:02:00,970 --> 00:02:06,000 ดีขนาดไฟล์จะเปลี่ยน เพราะเรากำลังจะมีมากขึ้น 38 00:02:06,000 --> 00:02:07,900 พิกเซลกว่าก่อน 39 00:02:07,900 --> 00:02:11,060 ขนาดภาพเป็นจึงยัง จะเปลี่ยนเป็น 40 00:02:11,060 --> 00:02:13,050 ความกว้างและความสูง 41 00:02:13,050 --> 00:02:17,180 >> ดังนั้นตัวแปรที่เป็นผู้ว่า? 42 00:02:17,180 --> 00:02:20,960 ดีถ้าคุณมองเข้าไปในส่วนหัว ข้อมูลที่คุณเห็นมี 43 00:02:20,960 --> 00:02:25,640 biSizeImage ซึ่งหมายถึงทั้งหมด ขนาดของภาพในไบต์ที่ 44 00:02:25,640 --> 00:02:28,340 รวมทั้งพิกเซลและช่องว่างภายใน 45 00:02:28,340 --> 00:02:32,520 biWidth เป็นความกว้างของภาพ พิกเซลลบช่องว่างภายใน 46 00:02:32,520 --> 00:02:35,580 biHeight เป็นความสูงของ ภาพพิกเซล 47 00:02:35,580 --> 00:02:39,200 และอื่น ๆ เหล่านี้จะมีอยู่ใน structs BITMAPFILEHEADER และ 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER 49 00:02:40,390 --> 00:02:45,300 คุณสามารถบอกได้เป็นที่หนึ่งซึ่งโดย จะ bmp.h และกำลังมองหาที่ 50 00:02:45,300 --> 00:02:49,670 struct BITMAPINFOHEADER และเห็น ซึ่งตัวแปรที่มีการระบุไว้มี 51 00:02:49,670 --> 00:02:54,700 >> ดังนั้นในการปรับปรุงส่วนหัว outfiles ข้อมูลที่คุณกำลังจะต้องการที่จะ 52 00:02:54,700 --> 00:02:57,025 เปลี่ยนค่าของ ความสูงและความกว้าง 53 00:02:57,025 --> 00:03:00,570 แต่โอกาสที่คุณอาจต้องบาง ของข้อมูลส่วนหัวของ INFILE 54 00:03:00,570 --> 00:03:03,670 ต่อมาเพื่อที่ดีที่สุดในการติดตามของทั้งสอง 55 00:03:03,670 --> 00:03:07,770 แต่มีความชัดเจนมากกับตัวแปรของคุณ ชื่อเพื่อที่ว่าคุณไม่ได้ตั้งใจ 56 00:03:07,770 --> 00:03:12,490 เขียนค่าที่ไม่ถูกต้องใน ส่วนหัว OUTFILE 57 00:03:12,490 --> 00:03:16,160 >> ดังนั้นตอนนี้ขอได้ที่อ่านเป็น scanline พิกเซลโดยพิกเซล 58 00:03:16,160 --> 00:03:20,210 อีกครั้งที่เรากำลังจะหันไปเชื่อถือของเรา ยื่น I / O ห้องสมุดและดูที่ 59 00:03:20,210 --> 00:03:22,100 ฟังก์ชั่น fread 60 00:03:22,100 --> 00:03:26,150 fread จะใช้เวลาในการชี้ไปยัง struct ที่จะมีไบต์ที่ 61 00:03:26,150 --> 00:03:30,130 ที่คุณกำลังอ่านในขนาดของแต่ละ องค์ประกอบที่คุณกำลังอ่าน - 62 00:03:30,130 --> 00:03:34,410 อีกครั้ง sizeof เป็นไปได้ที่มีประโยชน์ ทำงานที่นี่จำนวน 63 00:03:34,410 --> 00:03:38,820 องค์ประกอบของขนาดขนาดที่คุณ อ่านแล้วในที่สุด 64 00:03:38,820 --> 00:03:41,310 inpointer, แฟ้มที่ ที่คุณกำลังอ่านจาก 65 00:03:41,310 --> 00:03:46,770 ดังนั้นคุณกำลังการองค์ประกอบจำนวน ขนาดจาก inpointer และ 66 00:03:46,770 --> 00:03:49,040 วางไว้ในข้อมูล 67 00:03:49,040 --> 00:03:51,695 >> ตอนนี้มันถึงเวลาที่จะปรับขนาดในแนวนอน 68 00:03:51,695 --> 00:03:56,880 ถ้า n เท่ากับ 2 แล้วสำหรับแต่ละพิกเซลใน INFILE ที่เรากำลังจะเขียนมัน 69 00:03:56,880 --> 00:04:00,870 สองครั้งใน OUTFILE 70 00:04:00,870 --> 00:04:02,210 เราจะเขียนไฟล์ได้อย่างไร 71 00:04:02,210 --> 00:04:06,400 ดีเรามีหน้าที่ fwrite ดังนั้น เราได้นำตัวชี้ไปยังโครงสร้าง 72 00:04:06,400 --> 00:04:10,170 ที่มีไบต์ที่คุณ เขียนจากนั้นให้เราผ่านใน 73 00:04:10,170 --> 00:04:14,430 ขนาดจำนวนและการส่งออกที่ คุณกำลังจะเขียนว่า 74 00:04:14,430 --> 00:04:19,200 แล้วทำซ้ำขั้นตอนจะเป็น สามารถย้ำง่ายสำหรับวง 75 00:04:19,200 --> 00:04:21,740 >> แต่เราต้องจำไว้ เพื่อเพิ่มช่องว่างค่ะ 76 00:04:21,740 --> 00:04:26,040 แนวคิดของการขยายที่ดี แต่ละพิกเซลสามกัด แต่ 77 00:04:26,040 --> 00:04:28,940 ขนาดของแต่ละ scanline ต้อง เป็นผลคูณของ 4 ไบต์ 78 00:04:28,940 --> 00:04:33,660 ดังนั้นถ้าจำนวนพิกเซลไม่ได้เป็น หลาย 4 เราต้องเพิ่มบาง 79 00:04:33,660 --> 00:04:36,630 padding ซึ่งเป็นเพียงเลขศูนย์ 80 00:04:36,630 --> 00:04:42,130 ตอนนี้ไม่เหมือนใครทำมันและแตกต่างจาก คัดลอกจากนั้นภาพ INFILE และ 81 00:04:42,130 --> 00:04:44,370 ไฟล์ OUTFILE ได้แตกต่างกันมี ขยายที่แตกต่างกันเพราะพวกเขากำลัง 82 00:04:44,370 --> 00:04:46,360 ความกว้างที่แตกต่างกัน 83 00:04:46,360 --> 00:04:46,690 >> ตกลง 84 00:04:46,690 --> 00:04:51,050 ดังนั้นบางทีสูตรจะ เข้ามามีประโยชน์ที่นี่ 85 00:04:51,050 --> 00:04:55,120 ฉันจะปล่อยให้มันอยู่กับคุณที่จะหามันออกมา แต่ บอกคุณว่าจะเขียน padding, 86 00:04:55,120 --> 00:04:59,360 ดีก็เป็นเพียงฟังก์ชัน fputc ง่าย ผ่านในตัวละคร 87 00:04:59,360 --> 00:05:02,200 ที่คุณต้องการที่จะเขียนแล้ว ตัวชี้แฟ้มที่คุณ 88 00:05:02,200 --> 00:05:04,280 ต้องการที่จะเขียนถึง 89 00:05:04,280 --> 00:05:08,670 ดังนั้นขณะนี้ที่เราได้ปรับขนาดในแนวนอน และจากนั้นก็ใช้ช่องว่างภายใน 90 00:05:08,670 --> 00:05:12,030 จำไว้ว่าคุณต้องย้ายไฟล์ของคุณ ตัวบ่งชี้ที่ตำแหน่งเพราะคุณ 91 00:05:12,030 --> 00:05:14,480 ไม่สามารถ fread เป็นช่องว่างภายใน 92 00:05:14,480 --> 00:05:18,230 ดังนั้นคุณจึงต้องการให้แน่ใจว่าไฟล์ของคุณ ตัวบ่งชี้ตำแหน่งใน INFILE 93 00:05:18,230 --> 00:05:19,980 เป็นที่จุดที่ถูกต้อง 94 00:05:19,980 --> 00:05:23,970 เพราะเรายังต้องการที่จะ ปรับขนาดในแนวตั้ง 95 00:05:23,970 --> 00:05:27,090 เราก็ไม่สามารถยืดมันแนวนอน เพราะทุกความต้องการของแถว 96 00:05:27,090 --> 00:05:30,370 ที่จะคัดลอกครั้ง n 97 00:05:30,370 --> 00:05:33,050 >> ตอนนี้มีหลายที่แตกต่างกัน วิธีการที่จะทำเช่นนี้ 98 00:05:33,050 --> 00:05:39,010 ดังนั้นหนึ่งที่เราสามารถใช้วิธีการเขียนใน ที่เราจำทั้งหมดของพิกเซล 99 00:05:39,010 --> 00:05:42,840 ของแถวที่กำหนดในอาเรย์และ แล้วเราเขียนอาร์เรย์ที่เป็น 100 00:05:42,840 --> 00:05:44,730 หลายครั้งตามที่ต้องการ 101 00:05:44,730 --> 00:05:49,530 หรือมีวิธีการ recopy ที่ไหน, หลังจากที่ได้อ่านในหนึ่งแถวใน INFILE 102 00:05:49,530 --> 00:05:53,530 แล้วเขียนว่าเป็น OUTFILE, การเพิ่มช่องว่างภายในที่เรา fseek 103 00:05:53,530 --> 00:05:57,250 กลับไปยังจุดเริ่มต้นของแถวเดิม แล้วทำซ้ำในแนวนอน 104 00:05:57,250 --> 00:05:58,710 การปรับขนาดจากที่นั่น 105 00:05:58,710 --> 00:06:02,280 โดยไม่คำนึงถึงวิธีการที่แม้ว่าคุณจะ ต้องการทุกพิกเซลที่จะทำซ้ำ 106 00:06:02,280 --> 00:06:06,370 n ครั้งและทุกแถวจะเป็น ซ้ำแล้วซ้ำอีกครั้ง n เช่นกัน 107 00:06:06,370 --> 00:06:09,160 >> กับที่คุณจะมีบิตแมป ขนาดใหญ่กว่าชีวิต 108 00:06:09,160 --> 00:06:11,760 ชื่อของฉันคือ Zamyla และนี่คือ CS50 109 00:06:11,760 --> 00:06:19,542