[MUZIK Bermain] ZAMYLA CHAN: Mari tamparan perkara dengan saiz semula. Dalam saiz semula, pengguna akan lulus dalam, melalui baris arahan, imej bitmap yang mereka mahu anda untuk skala oleh sebilangan bahawa mereka juga lulus dalam, dalam baris arahan. Bagaimana kita melakukan ini? Nah, perkara pertama yang pertama, mari kita memecahkan ini ke dalam langkah-langkah. Anda akan mahu untuk membuka infile yang bahawa mereka memberi anda, dan juga mencipta dan membuka outfile yang anda akan meletakkan imej saiznya masuk Kemudian, kerana anda saiz semula, dan kerana ia bitmap, ia header, jadi anda akan juga mengemaskini pengepala maklumat untuk outfile itu, dan menulis bahawa masuk Kemudian, anda akan membaca ke dalam yang scanline daripada infile itu, piksel demi piksel, saiz semula melintang dan menulis mereka ke dalam piksel outfile, sebagaimana yang dinyatakan oleh skala pengguna. Anda akan ingat untuk menambah padding seperti yang diperlukan. Yang akan dibincang kemudian. Dan kemudian, juga mengubah saiz menegak. OK. Jadi ini akan menjadi lebih sedikit rumit daripada yang Selesai Ia, tetapi apa yang sama adalah copy.c yang akan, sekali lagi, membuktikan bahawa ia amat berguna. Ingat bahawa copy.c membuka fail, kemaskini maklumat header untuk outfile, kemudian membaca ke dalam scanline itu, piksel demi piksel, menulis setiap piksel ke scanline fail output ini. Jadi sekali lagi, langkah pertama anda mungkin mungkin adalah untuk cp, copy.c, resize.c ke dalam direktori PSET5 anda. Ingat walaupun, sebelum anda menyalinnya, memastikan bahawa anda memahami copy.c sangat teliti. OK. Jadi mari kita membuka fail. Anda tahu bagaimana untuk melakukannya. Saya akan meninggalkan bahawa kepada anda. Kemudian, kemaskinikan maklumat header untuk outfile itu. Kerana kita mempunyai bitmap baru, kami mempunyai maklumat header baru. Apakah yang berubah di sini? Nah, saiz fail akan berubah kerana kita akan mempunyai lebih piksel daripada sebelum ini. Saiz imej adalah, oleh itu, juga akan berubah, seperti yang lebar dan ketinggian. Jadi pembolehubah adalah mereka, sebenarnya? Nah, jika anda melihat ke dalam pengepala maklumat, anda lihat terdapat biSizeImage, yang merupakan jumlah yang Saiz imej dalam bait, termasuk pixels dan padding. biWidth adalah lebar imej dalam piksel, tolak padding itu. biHeight ialah ketinggian imej dalam piksel. Dan supaya orang-orang yang terkandung dalam structs BITMAPFILEHEADER dan BITMAPINFOHEADER. Anda boleh memberitahu yang mana satu yang oleh akan bmp.h dan melihat Struct BITMAPINFOHEADER dan seeing pembolehubah ada disitu. Jadi untuk mengemaskini pengepala outfiles maklumat, anda akan mahu untuk menukar nilai-nilai daripada ketinggian dan lebar. Tetapi kemungkinan besar, anda ingin membuat sedikit maklumat header infile ini kemudian, jadi yang terbaik untuk mengesan kedua-duanya. Tetapi sangat jelas dengan pembolehubah anda nama-nama supaya anda tidak sengaja menulis nilai-nilai yang tidak betul header untuk outfile itu. Jadi sekarang mari kita untuk membaca ke dalam scanline piksel demi piksel ini. Sekali lagi, kita akan beralih kepada kepercayaan kami memfailkan pustaka I / O, dan melihat fungsi fread. fread mengambil masa dalam penunjuk untuk struct yang yang akan mengandungi bait yang anda membaca dalam, saiz setiap elemen yang anda membaca - sekali lagi, sizeof akan menjadi berguna berfungsi di sini, bilangan unsur-unsur saiz, saiz, yang anda membaca, dan kemudian akhirnya, inpointer, fail yang anda membaca dari. Jadi anda mengambil bilangan elemen saiz dari inpointer, dan meletakkan mereka ke dalam data. Kini sudah tiba masanya untuk mengubah saiz melintang. jika n bersamaan 2, maka bagi setiap piksel dalam infile, kami akan menulisnya dua kali dalam outfile itu. Bagaimana kita menulis fail? Nah, kita mempunyai fungsi yang fwrite, jadi kami telah mengambil penunjuk untuk struct itu yang mengandungi bait yang anda bertulis daripada, dan kemudian kita lulus dalam saiz, bilangan, dan jumlah itu, di mana anda akan menulis itu. Dan kemudian mengulangi proses, akan dapat satu lelaran mudah untuk gelung. Tetapi kita perlu ingat untuk menambah padding masuk Konsep padding ialah, baik, setiap piksel adalah tiga gigitan, tetapi Saiz setiap scanline kemestian menjadi gandaan 4 bait. Jadi, jika bilangan piksel bukan gandaan 4, kita perlu menambah beberapa padding, yang hanya besar sifar. Sekarang, tidak seperti yang Selesai Ia, dan tidak seperti salinan, kemudian imej infile dan file outfile telah berbeza mempunyai padding yang berbeza kerana mereka lebar yang berbeza. OK. Jadi mungkin formula yang akan sangat berguna di sini. Saya akan serahkan kepada anda untuk mencari ia keluar, tetapi memberitahu anda bahawa, untuk menulis padding, dengan baik, ia hanya satu fungsi fputc mudah, lulus dalam watak yang anda mahu menulis, dan kemudian penunjuk fail yang anda mahu menulis untuk. Jadi sekarang kita telah bertukar saiz mendatar, dan kemudian digunakan padding, ingat bahawa anda perlu bergerak fail anda penunjuk kedudukan, kerana anda tidak boleh fread ke padding. Jadi, anda ingin memastikan bahawa fail anda penunjuk kedudukan dalam infile yang adalah pada ketika yang betul. Ini kerana kita mahu mengubah saiz menegak. Kita tidak boleh hanya menghulurkan mendatar, kerana setiap keperluan berturut-turut disalin n kali. Sekarang, terdapat beberapa yang berbeza cara-cara untuk melakukan ini. Jadi, kita boleh menggunakan kaedah menulis semula, dalam yang kita ingat semua piksel satu barisan yang diberikan dalam array, dan maka kita menulis array yang sebagai banyak kali yang perlu. Atau ada kaedah recopy di mana, selepas membaca dalam satu baris dalam infile yang dan kemudian menulis itu ke dalam outfile itu, menambah padding, kami fseek belakang untuk permulaan baris asal, dan kemudian mengulangi mendatar saiz semula dari sana. Tidak kira apa kaedah, walaupun, anda akan mahu setiap piksel akan berulang n kali, dan setiap baris menjadi berulang kali n juga. Dengan itu, anda akan mempunyai bitmap lebih besar daripada kehidupan. Nama saya Zamyla, dan ini adalah CS50.