>> [MUSIC PLAYING]
>> ZAMYLA CHAN: Ini adalah Miss Scarlett dengan candlestick.
Cerita detektif?
Nah, kita akan mencari tahu.
Dalam Clue papan permainan, Anda mungkin diberi gambar merah fisik.
Dan gambar yang sangat merah dan jerawatan, dan pekerjaan Anda adalah untuk
mengungkapkan pesan tersembunyi.
Dan biasanya Anda disediakan dengan merah kaca pembesar, atau layar merah untuk
mengungkapkan bahwa pesan tersembunyi.
Nah, kita akan meniru itu.
>> Dalam cerita detektif, Anda diberi gambar bitmap yang terlihat sangat jerawatan dan merah,
dan kemudian jalankan program cerita detektif untuk mengungkapkan pesan tersembunyi.
>> Jadi mari kita istirahat ini ke langkah.
Pertama, Anda ingin membuka file - petunjuk bahwa Anda telah diberikan.
Dan kemudian juga membuat berkas putusan bitmap.
Kemudian Anda ingin memperbarui bitmap Header info untuk outfile vonis.
Lebih pada nanti.
Dan kemudian Anda akan membaca ke dalam petunjuk, scanline, pixel by pixel,
mengubah warna pixel sebagai diperlukan, dan menulis
tersebut ke dalam putusan -
pixel by pixel ke dalam putusan scanline.
>> Bagaimana kita mulai akan hal ini?
Nah, untungnya, kita memiliki copy.c dalam kode distribusi.
Dan ini akan membuktikan sangat berguna untuk kita.
Copy.c membuka file, membaca dalam INFILE sundulan, dan kemudian update
sundulan outfile itu.
Dan kemudian membaca setiap pixel dalam scanline, pixel demi pixel, dan kemudian
menulis pixel yang ke outfile tersebut.
>> Jadi, langkah pertama Anda mungkin adalah untuk menjalankan berikut
perintah di terminal -
cp copy.c whodunit.c.
Ini akan membuat salinan copy.c bernama whodunit.c.
Jadi langkah pertama kami untuk membuka berkas, baik, ada yang tepat
replika itu di copy.c.
Jadi aku akan meninggalkan Anda untuk melihat itu.
>> Apa yang kita hadapi dalam PSET ini file I / O, pada dasarnya mengambil file,
membaca, menulis, mengedit mereka.
Bagaimana Anda pertama kali membuka file?
Nah, Anda akan mendeklarasikan file pointer, dan kemudian Anda memanggil
fungsi fopen.
Lulus di jalur, atau nama yang mengajukan, dan kemudian mode yang Anda inginkan
untuk membuka file yang masuk
Melewati dalam r akan terbuka foo.bmp untuk membaca.
Sedangkan fopen dengan lewat di w yang akan bar.bmp terbuka, untuk menulis file dan
sebenarnya menyuntingnya.
>> Jadi sekarang kita telah membuka file tersebut, kami Langkah berikutnya adalah untuk memperbarui header info
untuk outfile tersebut.
Apa info sundulan?
Yah, pertama-tama kita perlu tahu apa bitmap adalah.
Sebuah bitmap hanya sederhana susunan byte.
Dan mereka menyatakan dalam file ini sini, bmp.h, dengan sekelompok
Informasi apa bitmap sebenarnya terbuat dari.
Tapi apa yang kita benar-benar peduli adalah file bitmap header, di sini, dan
info bitmap header, di sini.
Header terdiri dari beberapa variabel yang akan terbukti sangat berguna.
Ada biSizeImage, yang merupakan ukuran total gambar dalam bytes.
Dan ini termasuk piksel dan padding.
Padding sangat penting, tetapi kita akan sampai ke itu nanti.
>> BiWidth merupakan lebar gambar dalam piksel dikurangi padding.
BiHeight kemudian juga ketinggian gambar dalam piksel.
Dan kemudian BITMAPFILEHEADER dan BITMAPINFOHEADER, seperti yang saya sebutkan
sebelumnya, mereka diwakili sebagai structs.
Jadi, Anda tidak dapat mengakses file header sendiri, tetapi Anda akan ingin untuk sampai ke
variabel dalam.
>> OK.
Jadi bagaimana kita memperbarui header info?
Yah, pertama-tama kita harus melihat apakah kita perlu mengubah informasi dari
yang INFILE, petunjuk, untuk outfile, putusan.
Adalah sesuatu yang berubah dalam kasus ini?
Well, tidak benar-benar, karena kita akan untuk hanya mengubah warna.
Kami tidak akan mengubah file ukuran, ukuran gambar, lebar,
atau ketinggian.
Jadi kau baik-baik saja untuk saat ini oleh hanya menyalin setiap pixel.
>> OK.
Jadi sekarang mari kita lihat bagaimana kita benar-benar dapat membaca setiap pixel dari file tersebut.
File lain I / O fungsi akan ikut bermain -
fread.
Dibutuhkan dalam pointer ke struct yang akan berisi byte yang
Anda sedang membaca.
Jadi Anda membaca ke dalam.
Dan kemudian Anda lulus dalam ukuran, yang ukuran setiap elemen yang Anda
ingin membaca.
Di sini, fungsi sizeof akan berguna.
Kemudian Anda lulus dalam jumlah yang merupakan jumlah elemen
ukuran untuk membaca.
Dan akhirnya, inptr, yang pointer file yang Anda
akan membaca dari.
Jadi semua elemen-elemen berada di dalam inptr dan mereka akan data.
>> Mari kita lihat contoh kecil.
Jika saya ingin membaca menjadi data dua anjing, baik, saya bisa melakukannya satu dari dua cara.
Saya juga bisa membaca dalam dua benda ukuran anjing dari inptr saya, atau saya bisa membaca
di salah satu objek ukuran dua anjing.
Jadi, Anda melihat bahwa tergantung pada cara bahwa Anda mengatur ukuran dan jumlah, Anda
dapat membaca dalam jumlah yang sama byte.
>> Jadi sekarang, mari kita mengubah warna pixel seperti yang kita butuhkan.
Jika Anda melihat bmp.h lagi, maka Anda akan melihat bahwa di bagian bawah
RGBTRIPLEs adalah struct lain, di mana mereka terdiri dari tiga byte.
Satu, rgbtBlue, rgbtGreen, dan rgbtRed.
Jadi masing-masing mewakili jumlah biru, jumlah warna hijau, dan
jumlah warna merah di dalam pixel ini, di mana setiap jumlah diwakili oleh
angka heksadesimal.
>> Jadi ff0000 akan menjadi warna biru, karena ia pergi dari biru,
hijau, merah.
Dan kemudian semua f akan menjadi putih.
Mari kita lihat smiley.bmp, yang Anda harus dalam kode distribusi anda.
Jika Anda membukanya hanya dalam gambar viewer, maka Anda akan
hanya melihat smiley merah.
Tetapi mengambil menyelam lebih dalam, kita akan melihat bahwa struktur
itu hanya piksel.
Kami memiliki piksel putih, dan kemudian piksel merah.
Putih, ffffff, dan kemudian semua piksel merah saya sudah berwarna untuk Anda
di sini, dan Anda melihat bahwa mereka 0000ff.
Nol biru, hijau nol, dan merah penuh.
Dan karena tersenyum adalah delapan piksel lebar, kita tidak memiliki bantalan apapun.
Baik.
>> Jadi jika saya harus menetapkan nilai yang berbeda ke RGBTRIPLE dan saya ingin
membuatnya hijau, maka apa yang akan saya lakukan adalah Saya akan mendeklarasikan RGBTRIPLE, bernama
tiga, dan kemudian untuk mengakses setiap byte dalam struct yang saya
akan menggunakan operator dot.
Jadi triple.rgbtBlue, saya bisa menetapkan bahwa untuk 0.
Green saya dapat menetapkan ke penuh - setiap nomor, benar-benar, antara 0 dan ff.
Dan kemudian merah, saya juga akan mengatakan 0.
Jadi itu memberi saya pixel hijau.
>> Selanjutnya, bagaimana jika saya ingin memeriksa nilai sesuatu?
Aku bisa memiliki sesuatu yang memeriksa apakah nilai tiga itu adalah rgbtBlue
ff dan kemudian cetak, "Aku merasa biru! ", sebagai hasilnya.
Sekarang, itu tidak berarti bahwa pixel berwarna biru, kan?
Karena nilai-nilai hijau dan merah pixel juga bisa memiliki non-0 nilai.
Semua ini berarti bahwa, dan semua yang ini memeriksa adalah
untuk warna biru penuh.
Tapi semua piksel juga bisa parsial nilai warna, seperti ini
Contoh berikutnya di sini.
>> Ini sedikit lebih sulit untuk melihat apa gambar ini sekarang.
Ini terlihat sedikit lebih seperti clue.bmp bahwa Anda akan diberikan.
Sekarang, secara fisik, Anda mungkin memecahkan ini, karena ada banyak merah, oleh
memegang layar merah untuk gambar sehingga bahwa warna lainnya dapat muncul.
Jadi bagaimana kita meniru ini dengan c?
Yah, kita mungkin menghapus semua merah dari gambar seluruhnya.
Dan untuk melakukan itu kita akan mengatur setiap nilai merah pixel untuk 0.
Dan sehingga gambar akan terlihat sedikit sedikit seperti ini, di mana kita tidak memiliki merah
apapun.
>> Kita bisa melihat pesan tersembunyi a sedikit lebih jelas sekarang.
Ini wajah tersenyum lain.
Atau mungkin kita bisa menggunakan metode lain.
Mungkin, kita bisa mengidentifikasi semua piksel merah -
yaitu, semua piksel dengan 0 biru, hijau 0, dan 0 merah -
dan mengubah mereka menjadi putih.
Dan gambar kita mungkin terlihat sesuatu seperti ini.
Sedikit lebih mudah untuk melihat.
>> Ada banyak cara lain untuk mengungkap pesan rahasia juga,
berurusan dengan manipulasi warna.
Mungkin Anda dapat menggunakan salah satu metode yang saya sebutkan di atas.
Dan selain itu, Anda mungkin ingin untuk meningkatkan beberapa warna
dan membawa mereka keluar.
>> Jadi sekarang kita telah mengubah pixel warna, selanjutnya kita hanya perlu menulis mereka
ke scanline tersebut, pixel demi pixel.
Dan sekali lagi, Anda akan ingin melihat ke belakang untuk copy.c, jika Anda belum disalin
sudah, dan melihat fwrite yang fungsi, yang mengambil data, pointer
ke struct yang berisi byte bahwa Anda membaca dari, ukuran
item, jumlah item, dan kemudian outptr ini -
tujuan file tersebut.
>> Setelah Anda menulis dalam pixel, Anda akan juga harus menulis di padding.
Apa bantalan?
Nah, setiap pixel rgbt adalah tiga byte panjang.
Tapi, yang scanline untuk gambar bitmap harus kelipatan dari empat byte.
Dan jika jumlah piksel bukanlah kelipatan empat, maka kita perlu menambahkan
Padding ini.
Padding hanya diwakili oleh 0s.
Jadi, bagaimana kita menulis, atau membaca ini?
Nah, ternyata bahwa Anda tidak bisa Padding sebenarnya fread, tetapi Anda dapat
menghitungnya.
>> Dalam kasus ini, petunjuk dan putusan memiliki lebar yang sama, sehingga
padding sama.
Dan padding, karena Anda akan melihat di copy.c, dihitung
dengan formula di bawah -
bi.biWidth kali sizeof (RGBTRIPLE) akan memberi kita berapa banyak byte bmp tersebut
telah di setiap baris.
Dari sana, modulos dan subtractions dengan 4 dapat menghitung berapa
banyak byte harus ditambahkan sehingga beberapa byte pada
setiap baris adalah empat.
>> Sekarang bahwa kita memiliki rumus untuk berapa banyak bantalan yang kita butuhkan, sekarang
kita bisa menulis.
Sekarang, saya sebutkan sebelumnya, padding hanya 0s.
Jadi dalam hal ini, kami hanya menempatkan char, dalam hal ini 0, ke kami
outptr - outfile kami.
Sehingga hanya bisa fputc 0, koma outptr.
>> Jadi, sementara kita sudah membaca ke kami File, file I / O telah terus melacak kami
posisi dalam file-file dengan sesuatu disebut indikator posisi file.
Anggap saja sebagai kursor.
Pada dasarnya, uang muka setiap kali bahwa kita fread, tapi kita harus
kontrol atas itu, juga.
>> Untuk memindahkan indikator posisi file, Anda dapat menggunakan fungsi fseek.
Dimana inptr mewakili file pointer bahwa Anda sedang mencari in,
jumlah adalah jumlah byte yang ingin memindahkan kursor, dan kemudian dari
berkaitan dengan titik referensi dari mana kursor Anda.
Jika Anda lulus dalam SEEK_CUR, bahwa mewakili arus
posisi dalam file.
Atau Anda dapat menggunakan beberapa parameter lainnya.
Jadi, kita mungkin ingin menggunakan fseek untuk melewati lebih padding dari dalam file.
Dan lagi, jika Anda terjebak, ada contoh bahwa dalam copy.c.
>> Jadi sekarang kita telah membuka file tersebut, petunjuk, dan putusan.
Kami telah memperbarui info header untuk vonis kita, karena setiap
bitmap membutuhkan header.
Kami telah kemudian dibaca ke dalam petunjuk ini scanline, pixel by pixel, mengubah
setiap warna yang diperlukan, dan menulis mereka ke dalam
putusan, pixel demi pixel.
Setelah Anda membuka putusan, Anda dapat melihat siapa pelakunya, atau apa rahasia
pesan.
Nama saya adalah Zamyla, dan ini adalah cerita detektif.