>> [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.