[MUSIC PLAYING] ZAMYLA CHAN: Mari kita blow hal dengan resize. Dalam mengubah ukuran, pengguna akan lulus dalam, melalui baris perintah, gambar bitmap yang mereka ingin Anda untuk skala dengan nomor bahwa mereka juga lulus dalam, pada command line. Bagaimana kita melakukan ini? Nah, hal pertama yang pertama, mari kita istirahat ini menjadi langkah-langkah. Anda akan ingin membuka INFILE yang bahwa mereka memberi Anda, serta membuat dan membuka outfile yang Anda akan menempatkan diubah ukurannya gambar masuk Kemudian, karena Anda mengubah ukuran, dan karena itu bitmap, itu header, sehingga Anda akan juga update header Informasi untuk outfile tersebut, dan menulis bahwa masuk Kemudian, Anda akan membaca ke yang scanline dari infile tersebut, pixel-by-pixel, ukuran horizontal dan menulis mereka piksel ke dalam outfile, sebagaimana ditentukan dengan skala pengguna. Anda akan ingat untuk tambahkan bantalan yang diperlukan. Lebih pada nanti. Dan kemudian, juga mengubah ukuran vertikal. OK. Jadi ini akan menjadi sedikit lebih rumit daripada Siapa Melakukannya, tapi apa yang sama adalah copy.c yang akan, lagi, terbukti sangat berguna. Ingat bahwa copy.c membuka file, update informasi header untuk outfile, kemudian membaca ke scanline tersebut, pixel-by-pixel, menulis setiap pixel scanline ke output file. Jadi sekali lagi, langkah pertama Anda mungkin mungkin adalah untuk cp, copy.c, resize.c ke dalam direktori PSET5 Anda. Ingat juga, sebelum Anda menyalinnya, untuk memastikan bahwa Anda memahami copy.c sangat teliti. OK. Jadi mari kita membuka file. Anda tahu bagaimana melakukan hal itu. Aku akan meninggalkan itu kepada Anda. Kemudian, perbarui informasi header untuk outfile tersebut. Karena kita memiliki bitmap baru, kami memiliki info header baru. Apa yang berubah di sini? Nah, ukuran file akan mengubah karena kita akan memiliki lebih banyak piksel dari sebelumnya. Ukuran gambar adalah, dengan demikian, juga akan berubah, seperti lebar dan tinggi. Jadi mana variabel adalah mereka, tepatnya? Nah, jika Anda melihat ke header informasi, Anda melihat ada biSizeImage, yang merupakan total ukuran gambar dalam bytes, termasuk piksel dan padding. biWidth adalah lebar gambar dalam pixel, dikurangi padding. biHeight adalah ketinggian gambar dalam piksel. Dan mereka yang terkandung dalam structs BITMAPFILEHEADER dan BITMAPINFOHEADER. Anda bisa mengatakan mana yang yang oleh akan bmp.h dan melihat BITMAPINFOHEADER struct dan penglihatan yang variabel yang terdaftar di sana. Jadi untuk memperbarui header outfiles informasi, Anda akan ingin mengubah nilai-nilai dari tinggi dan lebar. Tapi kemungkinan, Anda mungkin perlu beberapa informasi header infile ini kemudian, jadi terbaik untuk melacak keduanya. Namun sangat jelas dengan variabel Anda nama sehingga Anda tidak sengaja menulis nilai-nilai yang salah dalam header untuk outfile tersebut. Jadi sekarang mari kita membaca dalam yang scanline pixel-by-pixel. Sekali lagi, kita akan beralih ke kami terpercaya file I / O perpustakaan, dan melihat fungsi fread. fread mengambil dalam pointer ke struct yang akan berisi byte yang Anda membaca di, ukuran masing-masing elemen yang Anda baca - lagi, sizeof akan berguna berfungsi di sini, nomor unsur ukuran, ukuran, bahwa Anda membaca, dan kemudian akhirnya, inpointer, file yang Anda membaca dari. Jadi Anda mengambil unsur nomor ukuran dari inpointer, dan menempatkan mereka dalam data. Sekarang saatnya untuk mengubah ukuran horizontal. jika n sama dengan 2, maka untuk setiap pixel dalam INFILE, kita akan menuliskannya dua kali dalam outfile tersebut. Bagaimana kita menulis file? Nah, kita memiliki fungsi fwrite, sehingga kami telah mengambil pointer ke struct yang berisi byte yang Anda menulis dari, dan kemudian kita lulus dalam ukuran, jumlah, dan output, di mana Anda akan menulis itu. Dan kemudian mengulangi proses, akan mampu yang berulang sederhana untuk loop. Tapi kita harus ingat untuk menambahkan bantalan masuk Konsep padding adalah bahwa, baik, setiap pixel adalah tiga gigitan, tetapi ukuran masing-masing scanline harus kelipatan dari 4 byte. Jadi jika jumlah piksel bukanlah kelipatan 4, kita perlu menambahkan beberapa padding, yang hanya nol. Sekarang, tidak seperti yang Melakukannya, dan tidak seperti copy, maka gambar INFILE dan File outfile telah berbeda memiliki bantalan yang berbeda karena mereka lebar yang berbeda. OK. Jadi mungkin formula akan berguna di sini. Aku akan menyerahkan kepada Anda untuk menemukannya, tapi memberitahu Anda bahwa, untuk menulis padding, baik, itu hanya fungsi fputc sederhana, lewat di karakter bahwa Anda ingin menulis, dan kemudian file pointer yang ingin menulis. Jadi sekarang kita sudah diubah ukurannya horizontal, dan kemudian digunakan padding, ingat bahwa Anda perlu untuk memindahkan file Anda indikator posisi, karena Anda tidak bisa fread menjadi bantalan. Jadi, Anda ingin memastikan bahwa file Anda indikator posisi di INFILE yang adalah pada titik yang benar. Karena kami juga ingin mengubah ukuran vertikal. Kita tidak bisa hanya meregangkan secara horisontal, karena setiap kebutuhan baris untuk disalin n kali. Sekarang, ada beberapa yang berbeda cara untuk melakukan ini. Jadi salah satu, kita dapat menggunakan metode menulis ulang, di bahwa kita ingat semua piksel dari baris tertentu dalam array, dan maka kita menulis bahwa array sebagai sebanyak yang diperlukan. Atau ada metode recopy mana, setelah membaca di salah satu baris dalam INFILE yang dan kemudian menulis bahwa ke outfile tersebut, menambahkan padding, kita fseek kembali ke awal baris asli, dan kemudian ulangi horisontal mengubah ukuran dari sana. Terlepas dari metode ini, meskipun, Anda akan ingin setiap pixel harus diulang n kali, dan setiap baris menjadi diulang n kali juga. Dengan itu, Anda akan memiliki bitmap lebih besar dari kehidupan. Nama saya adalah Zamyla, dan ini adalah CS50.