[เล่นดนตรี] ZAMYLA จัน: ระเบิด Let 's สิ่งที่ขึ้นอยู่กับการปรับขนาด ในการปรับขนาดที่ผู้ใช้จะผ่านในการผ่านทาง บรรทัดคำสั่งภาพบิตแมปที่ พวกเขาต้องการให้คุณวัดจากจำนวน ว่าพวกเขายังผ่านใน ในบรรทัดคำสั่ง เราจะทำอย่างไร ดีสิ่งแรกแรกให้ พักนี้ลงเป็นขั้นตอน คุณจะต้องการเปิด INFILE ที่พวกเขาให้เป็น สร้างและเปิด OUTFILE ที่ คุณกำลังจะใส่ ปรับขนาดภาพค่ะ แล้วเพราะคุณปรับขนาดและ เพราะมันเป็นบิตแมปก็ส่วนหัวดังนั้น คุณจะยังปรับปรุงส่วนหัว ข้อมูล OUTFILE, และเขียนว่าค่ะ จากนั้นคุณจะได้อ่านใน scanline ของ INFILE, พิกเซลโดยพิกเซลปรับขนาดในแนวนอน และการเขียนที่เป็นพิกเซล OUTFILE ตามที่ระบุไว้ โดยขนาดของผู้ใช้ คุณจะจำ เพิ่มขยายได้ตามความจำเป็น เพิ่มเติมว่าภายหลัง แล้วก็ปรับขนาดในแนวตั้ง ตกลง ดังนั้นนี่เป็นไปได้นิด ๆ หน่อย ๆ ซับซ้อนกว่าใครทำมัน แต่ สิ่งที่คล้ายกันคือ copy.c ที่จะ อีกครั้งพิสูจน์ว่ามีประโยชน์มาก โปรดจำไว้ว่า copy.c เปิดไฟล์ ปรับปรุงข้อมูลส่วนหัวสำหรับ OUTFILE แล้วอ่านเป็น scanline, พิกเซลโดยพิกเซลเขียนทุกพิกเซล เป็น scanline ไฟล์ที่ส่งออกของ ดังนั้นอีกครั้งขั้นตอนแรกของคุณอาจจะเป็น จะ cp, copy.c, resize.c ในไดเรกทอรี PSET5 ของคุณ จำไว้ว่าก่อนที่คุณจะคัดลอก เพื่อให้แน่ใจว่าคุณเข้าใจ copy.c อย่างละเอียด ตกลง จึงขอเปิดแฟ้ม คุณจะรู้ว่าวิธีการทำที่ ฉันจะออกจากที่อยู่กับคุณ ถัดไปปรับปรุงข้อมูลส่วนหัว เพื่อ OUTFILE เพราะเรามีบิตแมปใหม่ เรามีข้อมูลส่วนหัวใหม่ มีการเปลี่ยนแปลงอะไรที่นี่ ดีขนาดไฟล์จะเปลี่ยน เพราะเรากำลังจะมีมากขึ้น พิกเซลกว่าก่อน ขนาดภาพเป็นจึงยัง จะเปลี่ยนเป็น ความกว้างและความสูง ดังนั้นตัวแปรที่เป็นผู้ว่า? ดีถ้าคุณมองเข้าไปในส่วนหัว ข้อมูลที่คุณเห็นมี biSizeImage ซึ่งหมายถึงทั้งหมด ขนาดของภาพในไบต์ที่ รวมทั้งพิกเซลและช่องว่างภายใน biWidth เป็นความกว้างของภาพ พิกเซลลบช่องว่างภายใน biHeight เป็นความสูงของ ภาพพิกเซล และอื่น ๆ เหล่านี้จะมีอยู่ใน structs BITMAPFILEHEADER และ BITMAPINFOHEADER คุณสามารถบอกได้เป็นที่หนึ่งซึ่งโดย จะ bmp.h และกำลังมองหาที่ struct BITMAPINFOHEADER และเห็น ซึ่งตัวแปรที่มีการระบุไว้มี ดังนั้นในการปรับปรุงส่วนหัว outfiles ข้อมูลที่คุณกำลังจะต้องการที่จะ เปลี่ยนค่าของ ความสูงและความกว้าง แต่โอกาสที่คุณอาจต้องบาง ของข้อมูลส่วนหัวของ INFILE ต่อมาเพื่อที่ดีที่สุดในการติดตามของทั้งสอง แต่มีความชัดเจนมากกับตัวแปรของคุณ ชื่อเพื่อที่ว่าคุณไม่ได้ตั้งใจ เขียนค่าที่ไม่ถูกต้องใน ส่วนหัว OUTFILE ดังนั้นตอนนี้ขอได้ที่อ่านเป็น scanline พิกเซลโดยพิกเซล อีกครั้งที่เรากำลังจะหันไปเชื่อถือของเรา ยื่น I / O ห้องสมุดและดูที่ ฟังก์ชั่น fread fread จะใช้เวลาในการชี้ไปยัง struct ที่จะมีไบต์ที่ ที่คุณกำลังอ่านในขนาดของแต่ละ องค์ประกอบที่คุณกำลังอ่าน - อีกครั้ง sizeof เป็นไปได้ที่มีประโยชน์ ทำงานที่นี่จำนวน องค์ประกอบของขนาดขนาดที่คุณ อ่านแล้วในที่สุด inpointer, แฟ้มที่ ที่คุณกำลังอ่านจาก ดังนั้นคุณกำลังการองค์ประกอบจำนวน ขนาดจาก inpointer และ วางไว้ในข้อมูล ตอนนี้มันถึงเวลาที่จะปรับขนาดในแนวนอน ถ้า n เท่ากับ 2 แล้วสำหรับแต่ละพิกเซลใน INFILE ที่เรากำลังจะเขียนมัน สองครั้งใน OUTFILE เราจะเขียนไฟล์ได้อย่างไร ดีเรามีหน้าที่ fwrite ดังนั้น เราได้นำตัวชี้ไปยังโครงสร้าง ที่มีไบต์ที่คุณ เขียนจากนั้นให้เราผ่านใน ขนาดจำนวนและการส่งออกที่ คุณกำลังจะเขียนว่า แล้วทำซ้ำขั้นตอนจะเป็น สามารถย้ำง่ายสำหรับวง แต่เราต้องจำไว้ เพื่อเพิ่มช่องว่างค่ะ แนวคิดของการขยายที่ดี แต่ละพิกเซลสามกัด แต่ ขนาดของแต่ละ scanline ต้อง เป็นผลคูณของ 4 ไบต์ ดังนั้นถ้าจำนวนพิกเซลไม่ได้เป็น หลาย 4 เราต้องเพิ่มบาง padding ซึ่งเป็นเพียงเลขศูนย์ ตอนนี้ไม่เหมือนใครทำมันและแตกต่างจาก คัดลอกจากนั้นภาพ INFILE และ ไฟล์ OUTFILE ได้แตกต่างกันมี ขยายที่แตกต่างกันเพราะพวกเขากำลัง ความกว้างที่แตกต่างกัน ตกลง ดังนั้นบางทีสูตรจะ เข้ามามีประโยชน์ที่นี่ ฉันจะปล่อยให้มันอยู่กับคุณที่จะหามันออกมา แต่ บอกคุณว่าจะเขียน padding, ดีก็เป็นเพียงฟังก์ชัน fputc ง่าย ผ่านในตัวละคร ที่คุณต้องการที่จะเขียนแล้ว ตัวชี้แฟ้มที่คุณ ต้องการที่จะเขียนถึง ดังนั้นขณะนี้ที่เราได้ปรับขนาดในแนวนอน และจากนั้นก็ใช้ช่องว่างภายใน จำไว้ว่าคุณต้องย้ายไฟล์ของคุณ ตัวบ่งชี้ที่ตำแหน่งเพราะคุณ ไม่สามารถ fread เป็นช่องว่างภายใน ดังนั้นคุณจึงต้องการให้แน่ใจว่าไฟล์ของคุณ ตัวบ่งชี้ตำแหน่งใน INFILE เป็นที่จุดที่ถูกต้อง เพราะเรายังต้องการที่จะ ปรับขนาดในแนวตั้ง เราก็ไม่สามารถยืดมันแนวนอน เพราะทุกความต้องการของแถว ที่จะคัดลอกครั้ง n ตอนนี้มีหลายที่แตกต่างกัน วิธีการที่จะทำเช่นนี้ ดังนั้นหนึ่งที่เราสามารถใช้วิธีการเขียนใน ที่เราจำทั้งหมดของพิกเซล ของแถวที่กำหนดในอาเรย์และ แล้วเราเขียนอาร์เรย์ที่เป็น หลายครั้งตามที่ต้องการ หรือมีวิธีการ recopy ที่ไหน, หลังจากที่ได้อ่านในหนึ่งแถวใน INFILE แล้วเขียนว่าเป็น OUTFILE, การเพิ่มช่องว่างภายในที่เรา fseek กลับไปยังจุดเริ่มต้นของแถวเดิม แล้วทำซ้ำในแนวนอน การปรับขนาดจากที่นั่น โดยไม่คำนึงถึงวิธีการที่แม้ว่าคุณจะ ต้องการทุกพิกเซลที่จะทำซ้ำ n ครั้งและทุกแถวจะเป็น ซ้ำแล้วซ้ำอีกครั้ง n เช่นกัน กับที่คุณจะมีบิตแมป ขนาดใหญ่กว่าชีวิต ชื่อของฉันคือ Zamyla และนี่คือ CS50