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