>> [MUZIK Bermain]
>> ZAMYLA CHAN: Ia adalah Miss Scarlett dengan lilin.
Kisah penyiasatan?
Nah, kita akan mengetahui.
Dalam petunjuk permainan papan, anda mungkin diberi imej merah fizikal.
Dan imej yang sangat merah dan turun naik, dan tugas anda ialah untuk
mendedahkan mesej yang tersembunyi.
Dan biasanya anda disediakan dengan merah kaca pembesar, atau skrin merah untuk
mendedahkan bahawa mesej tersembunyi.
Nah, kita akan meniru itu.
>> Dalam Kisah penyiasatan, anda diberi imej bitmap yang kelihatan sangat turun naik dan merah,
dan jalankan program Kisah penyiasatan yang untuk mendedahkan mesej tersembunyi.
>> Jadi mari kita memecahkan ini ke dalam langkah-langkah.
Pertama, anda mahu untuk membuka fail - petunjuk yang anda telah diberikan.
Dan kemudian juga mewujudkan fail keputusan bitmap.
Kemudian anda ingin mengemaskini bitmap header info untuk outfile keputusan itu.
Yang akan dibincang kemudian.
Dan kemudian anda akan baca di petunjuk, scanline, piksel dengan,
menukar warna piksel sebagai perlu, dan menulis
mereka ke dalam keputusan itu -
piksel dengan ke dalam keputusan scanline.
>> Bagaimana kita mula pergi tentang perkara ini?
Baik, bernasib baik, kami mempunyai copy.c dalam kod pengedaran.
Dan ini akan membuktikan amat berguna kepada kami.
Copy.c membuka fail, dibaca dalam yang header infile, dan kemudian mengemas kini
header outfile ini.
Dan kemudian ia membaca setiap piksel dalam scanline, piksel dengan, dan kemudian
menulis piksel yang ke outfile itu.
>> Jadi, langkah pertama anda mungkin adalah untuk menjalankan yang berikut
perintah di terminal -
cp copy.c whodunit.c.
Ini akan membuat salinan copy.c dinamakan whodunit.c.
Jadi langkah pertama kami untuk membuka fail, baik, ada yang tepat
replika yang di copy.c.
Jadi saya akan meninggalkan anda untuk melihat itu.
>> Apa yang kita berurusan dengan dalam Serangga ini fail I / O, pada dasarnya mengambil gambar,
membaca, menulis, mengedit mereka.
Bagaimana anda mula-mula membuka fail yang dibenarkan?
Nah, anda akan mengisytiharkan fail penunjuk, dan kemudian anda memanggil
fungsi fopen.
Lulus dalam jalan yang benar, atau nama yang fail, dan kemudian mod yang anda mahu
untuk membuka fail yang masuk
Lulus dalam r satu akan terbuka foo.bmp untuk membaca.
Manakala fopen dengan lulus dalam w yang akan bar.bmp terbuka, untuk menulis fail dan
sebenarnya menyuntingnya.
>> Jadi sekarang kita telah membuka fail tersebut, kami Langkah seterusnya adalah untuk mengemaskini maklumat pengepala
untuk outfile itu.
Apakah yang dimaksudkan dengan maklumat header?
Well, pertama kita perlu tahu apa bitmap adalah.
Bitmap adalah hanya mudah yang susunan bait.
Dan mereka diisytiharkan dalam fail ini di sini, bmp.h, dengan sekumpulan
maklumat apa bitmap yang sebenarnya dibuat daripada.
Tetapi apa yang kita benar-benar mengambil berat tentang adalah header fail bitmap, di sini, dan
header info bitmap, di sini.
Pengepala ialah terdiri daripada beberapa pembolehubah yang akan membuktikan bahawa ia amat berguna.
Terdapat biSizeImage, yang merupakan Jumlah keseluruhan imej dalam bait.
Dan ini termasuk pixels dan padding.
Padding adalah sangat penting, tetapi kita akan mendapat yang kemudian.
>> BiWidth mewakili lebar imej dalam piksel tolak padding itu.
BiHeight kemudian juga ketinggian imej dalam piksel.
Dan kemudian BITMAPFILEHEADER dan BITMAPINFOHEADER, seperti yang saya sebutkan
sebelum ini, mereka yang diwakili sebagai structs.
Jadi, anda tidak boleh mengakses fail header sendiri, tetapi anda akan mahu ke
pembolehubah-pembolehubah di dalam.
>> OK.
Jadi bagaimana kita mengemaskini maklumat header?
Well, pertama kita perlu melihat sama ada kita perlu menukar apa-apa maklumat daripada
infile itu, petunjuk, kepada outfile, keputusan itu.
Adakah apa-apa perubahan dalam kes ini?
Well, sebenarnya tidak, kerana kita akan untuk hanya menukar warna.
Kami tidak akan berubah fail saiz, saiz imej, lebar,
atau ketinggian.
Jadi anda semua sesuai untuk sekarang dengan hanya menyalin setiap piksel.
>> OK.
Jadi sekarang mari kita lihat bagaimana kita sebenarnya boleh membaca setiap piksel dari fail.
Satu lagi fail I / O fungsi akan mula bermain -
fread.
Ia mengambil masa dalam penunjuk untuk struct itu yang akan mengandungi bait yang
anda membaca.
Jadi anda membaca ke dalam itu.
Dan kemudian anda meninggal dalam saiz, yang merupakan saiz setiap elemen yang anda
hendak baca.
Di sini, fungsi sizeof akan sangat berguna.
Kemudian anda meninggal dalam bilangan yang mewakili bilangan unsur-unsur
saiz untuk dibaca.
Dan kemudian akhirnya, inptr, yang merupakan penunjuk fail yang anda
akan membaca dari.
Jadi semua unsur-unsur berada di dalam inptr dan mereka akan data.
>> Mari kita lihat satu contoh yang kecil.
Jika saya mahu membaca ke dalam data dua anjing, baik, saya boleh melakukannya dengan dua cara.
Saya sama ada boleh dibaca dua objek saiz anjing dari inptr saya, atau saya boleh membaca
dalam satu membantah saiz dua anjing.
Jadi anda lihat bahawa bergantung kepada cara bahawa anda menguruskan saiz dan bilangan, anda
boleh membaca dalam jumlah yang sama bait.
>> Jadi sekarang, mari kita menukar warna pixel seperti yang kita perlukan.
Jika anda melihat bmp.h sekali lagi, maka anda akan melihat bahawa di bahagian bawah
RGBTRIPLEs adalah struct lain, di mana mereka terdiri dari tiga bait.
Satu, rgbtBlue, rgbtGreen, dan rgbtRed.
Jadi setiap mewakili jumlah biru, jumlah hijau, dan
jumlah merah di dalam piksel ini, di mana setiap jumlah diwakili oleh
nombor perenambelasan.
>> Jadi FF0000 akan menjadi warna biru, kerana ia pergi dari biru,
kepada hijau, ke merah.
Dan kemudian f semua akan menjadi putih.
Mari kita lihat smiley.bmp, yang anda ada di dalam kod pengedaran anda.
Jika anda membukanya dalam hanya imej penonton, maka anda akan
hanya melihat smiley merah.
Tetapi mengambil menyelam yang lebih mendalam di dalam, kita akan melihat bahawa struktur
daripada ia hanya piksel.
Kami mempunyai piksel putih, dan kemudian piksel merah.
Putih, FFFFFF, dan kemudian semua piksel merah saya berwarna dalam untuk anda
di sini, dan anda melihat bahawa mereka 0000ff.
Zero biru, sifar hijau, dan merah penuh.
Dan sejak smiley adalah lapan piksel luas kita tidak mempunyai apa-apa padding.
Baiklah.
>> Jadi jika saya memberikan nilai yang berbeza untuk RGBTRIPLE dan saya mahu
menjadikannya hijau, kemudian apa yang saya akan lakukan ialah Saya akan mengisytiharkan RGBTRIPLE, dinamakan
tiga kali ganda, dan kemudian untuk mengakses setiap bait dalam yang struct saya
akan menggunakan operator titik.
Jadi triple.rgbtBlue, saya boleh menyerahhakkan yang kepada 0.
Hijau saya boleh sediakan bagi penuh - mana-mana nombor, benar-benar, antara 0 dan seterusnya.
Dan kemudian merah, saya juga akan berkata 0.
Demikian maka yang memberikan saya piksel hijau.
>> Seterusnya, bagaimana jika saya ingin menyemak nilai sesuatu?
Saya boleh mempunyai sesuatu yang memeriksa sama ada nilai rgbtBlue tiga kali ganda adalah
dan seterusnya dan kemudian cetak, "saya rasa biru! ", sebagai hasilnya.
Sekarang, yang tidak bermakna yang piksel adalah biru, bukan?
Oleh kerana nilai-nilai hijau dan merah piksel ini juga boleh mempunyai bukan 0 nilai-nilai.
Semua ini bermakna, dan semua yang ini memeriksa adalah
untuk warna biru penuh.
Tetapi semua piksel juga boleh mempunyai sebahagian nilai warna, seperti ini
Contoh seterusnya di sini.
>> Ia sedikit lebih sukar untuk melihat apa imej ini sekarang.
Ini kelihatan sedikit lebih seperti clue.bmp bahawa anda akan diberikan.
Sekarang, dari segi fizikal, anda mungkin menyelesaikan ini, kerana ada banyak merah, oleh
bertahan skrin merah untuk imej jadi bahawa warna-warna lain boleh muncul.
Jadi bagaimana kita meniru ini dengan c?
Well, kita mungkin membuang semua merah daripada imej sepenuhnya.
Dan untuk berbuat demikian bahawa kita akan ditetapkan setiap nilai piksel merah untuk 0.
Dan supaya imej akan kelihatan sedikit sedikit seperti ini, di mana kita tidak mempunyai merah
sekalipun.
>> Kita boleh melihat yang tersembunyi mesej sedikit lebih jelas sekarang.
Ia wajah lain smiley.
Atau mungkin kita boleh menggunakan kaedah lain.
Mungkin, kita boleh mengenal pasti semua piksel merah -
iaitu, semua piksel dengan 0 biru, hijau 0, dan 0 merah -
dan menukar mereka kepada warna putih.
Dan imej kami mungkin kelihatan sesuatu seperti ini.
Sedikit lebih mudah untuk melihat.
>> Terdapat banyak cara lain untuk mendedahkan mesej rahsia juga,
berurusan dengan manipulasi warna.
Mungkin anda mungkin menggunakan salah satu daripada kaedah yang saya nyatakan di atas.
Dan tambahan, anda mungkin mahu untuk meningkatkan beberapa warna
dan membawa mereka keluar.
>> Jadi sekarang kita telah mengubah piksel warna, seterusnya kita hanya perlu untuk menulis mereka
masuk ke scanline itu, piksel dengan.
Dan sekali lagi, anda akan mahu melihat kembali untuk copy.c, jika anda tidak disalin
ia sudah, dan melihat fwrite yang fungsi, yang mengambil data, penunjuk
untuk struct yang mengandungi bait yang bahawa anda membaca dari, saiz
barang-barang, bilangan item, dan kemudian outptr yang -
destinasi fail-fail.
>> Selepas anda menulis dalam piksel, anda akan juga perlu menulis dalam padding itu.
Apakah padding?
Well, setiap piksel rgbt adalah tiga bait.
Tetapi, scanline untuk imej bitmap perlu satu gandaan empat bait.
Dan jika bilangan piksel bukan gandaan empat, maka kita perlu menambah
padding ini.
Padding hanya diwakili oleh 0-an.
Jadi, bagaimana kita menulis, atau membaca ini?
Nah, ternyata bahawa anda tidak boleh padding sebenarnya fread, tetapi anda boleh
mengira ia.
>> Dalam kes ini, petunjuk dan keputusan itu mempunyai lebar yang sama, maka
padding adalah sama.
Dan padding, seperti yang anda akan melihat dalam copy.c, dikira
dengan formula di bawah -
kali bi.biWidth sizeof (RGBTRIPLE) akan memberi kita berapa banyak bait bmp yang
mempunyai dalam setiap baris.
Dari sana, modulos dan penolakan dengan 4 boleh mengira berapa
banyak bait perlu ditambah supaya berbilang bait pada
setiap baris adalah empat.
>> Sekarang kita mempunyai formula untuk berapa banyak padding yang kita perlukan, sekarang
kita boleh menulisnya.
Sekarang, saya nyatakan sebelum ini, padding hanya 0-an.
Jadi dalam hal itu, kami hanya meletakkan a char, dalam kes ini yang 0, ke dalam kami
outptr - outfile kami.
Jadi yang hanya boleh fputc 0, koma outptr.
>> Oleh itu, walaupun kita telah membaca ke dalam kami fail, fail I / O telah disimpan mengesan kami
kedudukan dalam fail-fail dengan sesuatu dipanggil penunjuk kedudukan fail.
Anggapkannya sebagai kursor.
Pada asasnya, ia pendahuluan setiap kali yang kita fread, tetapi kita mempunyai
kawalan ke atas itu juga.
>> Untuk menggerakkan penunjuk kedudukan fail, anda boleh menggunakan fungsi fseek itu.
Di mana inptr mewakili fail penunjuk bahawa anda sedang mencari dalam,
jumlah bilangan bait yang anda mahu menggerakkan kursor, dan kemudian dari
berkaitan dengan titik rujukan dari mana kursor anda.
Jika anda lulus dalam SEEK_CUR, yang mewakili arus yang
kedudukan dalam fail.
Atau anda boleh menggunakan beberapa parameter lain.
Jadi, kita mungkin mahu menggunakan fseek melangkau sepanjang padding fail dalam.
Dan sekali lagi, jika anda terjebak, ada satu contoh bahawa dalam copy.c.
>> Jadi, kami kini membuka fail, petunjuk, dan keputusan itu.
Kami telah mengemas kini maklumat pengepala untuk keputusan kita, kerana setiap
bitmap memerlukan tandukan.
Kami kemudian membaca ke dalam petunjuk ini scanline, piksel dengan, menukar
setiap warna yang perlu, dan menulis mereka ke dalam
keputusan, piksel dengan.
Sebaik sahaja anda membuka keputusan, anda boleh melihat yang pelakunya, atau apa rahsia
Mesej adalah.
Nama saya Zamyla, dan ini adalah Kisah penyiasatan.