>> [เล่นดนตรี]
>> 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