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