1 00:00:00,000 --> 00:00:09,500 >> [MUSIC PLAYING] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Ini adalah Miss Scarlett dengan candlestick. 3 00:00:12,350 --> 00:00:13,560 Cerita detektif? 4 00:00:13,560 --> 00:00:15,030 Nah, kita akan mencari tahu. 5 00:00:15,030 --> 00:00:20,870 Dalam Clue papan permainan, Anda mungkin diberi gambar merah fisik. 6 00:00:20,870 --> 00:00:24,120 Dan gambar yang sangat merah dan jerawatan, dan pekerjaan Anda adalah untuk 7 00:00:24,120 --> 00:00:25,490 mengungkapkan pesan tersembunyi. 8 00:00:25,490 --> 00:00:29,740 Dan biasanya Anda disediakan dengan merah kaca pembesar, atau layar merah untuk 9 00:00:29,740 --> 00:00:31,410 mengungkapkan bahwa pesan tersembunyi. 10 00:00:31,410 --> 00:00:33,340 Nah, kita akan meniru itu. 11 00:00:33,340 --> 00:00:37,960 >> Dalam cerita detektif, Anda diberi gambar bitmap yang terlihat sangat jerawatan dan merah, 12 00:00:37,960 --> 00:00:43,430 dan kemudian jalankan program cerita detektif untuk mengungkapkan pesan tersembunyi. 13 00:00:43,430 --> 00:00:45,650 >> Jadi mari kita istirahat ini ke langkah. 14 00:00:45,650 --> 00:00:50,390 Pertama, Anda ingin membuka file - petunjuk bahwa Anda telah diberikan. 15 00:00:50,390 --> 00:00:53,880 Dan kemudian juga membuat berkas putusan bitmap. 16 00:00:53,880 --> 00:00:58,240 Kemudian Anda ingin memperbarui bitmap Header info untuk outfile vonis. 17 00:00:58,240 --> 00:00:59,920 Lebih pada nanti. 18 00:00:59,920 --> 00:01:04,319 Dan kemudian Anda akan membaca ke dalam petunjuk, scanline, pixel by pixel, 19 00:01:04,319 --> 00:01:07,320 mengubah warna pixel sebagai diperlukan, dan menulis 20 00:01:07,320 --> 00:01:08,960 tersebut ke dalam putusan - 21 00:01:08,960 --> 00:01:12,000 pixel by pixel ke dalam putusan scanline. 22 00:01:12,000 --> 00:01:13,780 >> Bagaimana kita mulai akan hal ini? 23 00:01:13,780 --> 00:01:16,940 Nah, untungnya, kita memiliki copy.c dalam kode distribusi. 24 00:01:16,940 --> 00:01:21,240 Dan ini akan membuktikan sangat berguna untuk kita. 25 00:01:21,240 --> 00:01:29,700 Copy.c membuka file, membaca dalam INFILE sundulan, dan kemudian update 26 00:01:29,700 --> 00:01:31,070 sundulan outfile itu. 27 00:01:31,070 --> 00:01:37,010 Dan kemudian membaca setiap pixel dalam scanline, pixel demi pixel, dan kemudian 28 00:01:37,010 --> 00:01:42,390 menulis pixel yang ke outfile tersebut. 29 00:01:42,390 --> 00:01:45,020 >> Jadi, langkah pertama Anda mungkin adalah untuk menjalankan berikut 30 00:01:45,020 --> 00:01:46,420 perintah di terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Ini akan membuat salinan copy.c bernama whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Jadi langkah pertama kami untuk membuka berkas, baik, ada yang tepat 34 00:01:58,320 --> 00:02:00,070 replika itu di copy.c. 35 00:02:00,070 --> 00:02:03,360 Jadi aku akan meninggalkan Anda untuk melihat itu. 36 00:02:03,360 --> 00:02:07,860 >> Apa yang kita hadapi dalam PSET ini file I / O, pada dasarnya mengambil file, 37 00:02:07,860 --> 00:02:10,229 membaca, menulis, mengedit mereka. 38 00:02:10,229 --> 00:02:12,650 Bagaimana Anda pertama kali membuka file? 39 00:02:12,650 --> 00:02:16,800 Nah, Anda akan mendeklarasikan file pointer, dan kemudian Anda memanggil 40 00:02:16,800 --> 00:02:18,670 fungsi fopen. 41 00:02:18,670 --> 00:02:23,150 Lulus di jalur, atau nama yang mengajukan, dan kemudian mode yang Anda inginkan 42 00:02:23,150 --> 00:02:24,700 untuk membuka file yang masuk 43 00:02:24,700 --> 00:02:28,620 Melewati dalam r akan terbuka foo.bmp untuk membaca. 44 00:02:28,620 --> 00:02:35,670 Sedangkan fopen dengan lewat di w yang akan bar.bmp terbuka, untuk menulis file dan 45 00:02:35,670 --> 00:02:37,020 sebenarnya menyuntingnya. 46 00:02:37,020 --> 00:02:41,970 >> Jadi sekarang kita telah membuka file tersebut, kami Langkah berikutnya adalah untuk memperbarui header info 47 00:02:41,970 --> 00:02:43,230 untuk outfile tersebut. 48 00:02:43,230 --> 00:02:44,610 Apa info sundulan? 49 00:02:44,610 --> 00:02:48,160 Yah, pertama-tama kita perlu tahu apa bitmap adalah. 50 00:02:48,160 --> 00:02:51,000 Sebuah bitmap hanya sederhana susunan byte. 51 00:02:51,000 --> 00:02:55,480 Dan mereka menyatakan dalam file ini sini, bmp.h, dengan sekelompok 52 00:02:55,480 --> 00:02:58,610 Informasi apa bitmap sebenarnya terbuat dari. 53 00:02:58,610 --> 00:03:05,730 Tapi apa yang kita benar-benar peduli adalah file bitmap header, di sini, dan 54 00:03:05,730 --> 00:03:08,460 info bitmap header, di sini. 55 00:03:08,460 --> 00:03:13,170 Header terdiri dari beberapa variabel yang akan terbukti sangat berguna. 56 00:03:13,170 --> 00:03:18,400 Ada biSizeImage, yang merupakan ukuran total gambar dalam bytes. 57 00:03:18,400 --> 00:03:20,890 Dan ini termasuk piksel dan padding. 58 00:03:20,890 --> 00:03:24,210 Padding sangat penting, tetapi kita akan sampai ke itu nanti. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth merupakan lebar gambar dalam piksel dikurangi padding. 60 00:03:30,000 --> 00:03:34,220 BiHeight kemudian juga ketinggian gambar dalam piksel. 61 00:03:34,220 --> 00:03:38,240 Dan kemudian BITMAPFILEHEADER dan BITMAPINFOHEADER, seperti yang saya sebutkan 62 00:03:38,240 --> 00:03:40,900 sebelumnya, mereka diwakili sebagai structs. 63 00:03:40,900 --> 00:03:45,410 Jadi, Anda tidak dapat mengakses file header sendiri, tetapi Anda akan ingin untuk sampai ke 64 00:03:45,410 --> 00:03:47,370 variabel dalam. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Jadi bagaimana kita memperbarui header info? 67 00:03:50,600 --> 00:03:54,020 Yah, pertama-tama kita harus melihat apakah kita perlu mengubah informasi dari 68 00:03:54,020 --> 00:03:58,480 yang INFILE, petunjuk, untuk outfile, putusan. 69 00:03:58,480 --> 00:04:00,250 Adalah sesuatu yang berubah dalam kasus ini? 70 00:04:00,250 --> 00:04:04,320 Well, tidak benar-benar, karena kita akan untuk hanya mengubah warna. 71 00:04:04,320 --> 00:04:07,550 Kami tidak akan mengubah file ukuran, ukuran gambar, lebar, 72 00:04:07,550 --> 00:04:08,310 atau ketinggian. 73 00:04:08,310 --> 00:04:14,010 Jadi kau baik-baik saja untuk saat ini oleh hanya menyalin setiap pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Jadi sekarang mari kita lihat bagaimana kita benar-benar dapat membaca setiap pixel dari file tersebut. 76 00:04:20,720 --> 00:04:23,640 File lain I / O fungsi akan ikut bermain - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Dibutuhkan dalam pointer ke struct yang akan berisi byte yang 79 00:04:28,440 --> 00:04:30,110 Anda sedang membaca. 80 00:04:30,110 --> 00:04:31,890 Jadi Anda membaca ke dalam. 81 00:04:31,890 --> 00:04:36,090 Dan kemudian Anda lulus dalam ukuran, yang ukuran setiap elemen yang Anda 82 00:04:36,090 --> 00:04:37,360 ingin membaca. 83 00:04:37,360 --> 00:04:40,640 Di sini, fungsi sizeof akan berguna. 84 00:04:40,640 --> 00:04:45,570 Kemudian Anda lulus dalam jumlah yang merupakan jumlah elemen 85 00:04:45,570 --> 00:04:47,480 ukuran untuk membaca. 86 00:04:47,480 --> 00:04:51,180 Dan akhirnya, inptr, yang pointer file yang Anda 87 00:04:51,180 --> 00:04:52,530 akan membaca dari. 88 00:04:52,530 --> 00:04:58,650 Jadi semua elemen-elemen berada di dalam inptr dan mereka akan data. 89 00:04:58,650 --> 00:05:01,660 >> Mari kita lihat contoh kecil. 90 00:05:01,660 --> 00:05:07,590 Jika saya ingin membaca menjadi data dua anjing, baik, saya bisa melakukannya satu dari dua cara. 91 00:05:07,590 --> 00:05:15,250 Saya juga bisa membaca dalam dua benda ukuran anjing dari inptr saya, atau saya bisa membaca 92 00:05:15,250 --> 00:05:19,280 di salah satu objek ukuran dua anjing. 93 00:05:19,280 --> 00:05:23,580 Jadi, Anda melihat bahwa tergantung pada cara bahwa Anda mengatur ukuran dan jumlah, Anda 94 00:05:23,580 --> 00:05:25,840 dapat membaca dalam jumlah yang sama byte. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Jadi sekarang, mari kita mengubah warna pixel seperti yang kita butuhkan. 97 00:05:33,020 --> 00:05:37,320 Jika Anda melihat bmp.h lagi, maka Anda akan melihat bahwa di bagian bawah 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs adalah struct lain, di mana mereka terdiri dari tiga byte. 99 00:05:42,920 --> 00:05:49,220 Satu, rgbtBlue, rgbtGreen, dan rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Jadi masing-masing mewakili jumlah biru, jumlah warna hijau, dan 101 00:05:52,480 --> 00:05:57,250 jumlah warna merah di dalam pixel ini, di mana setiap jumlah diwakili oleh 102 00:05:57,250 --> 00:05:58,670 angka heksadesimal. 103 00:05:58,670 --> 00:06:04,370 >> Jadi ff0000 akan menjadi warna biru, karena ia pergi dari biru, 104 00:06:04,370 --> 00:06:05,850 hijau, merah. 105 00:06:05,850 --> 00:06:09,300 Dan kemudian semua f akan menjadi putih. 106 00:06:09,300 --> 00:06:13,440 Mari kita lihat smiley.bmp, yang Anda harus dalam kode distribusi anda. 107 00:06:13,440 --> 00:06:15,690 Jika Anda membukanya hanya dalam gambar viewer, maka Anda akan 108 00:06:15,690 --> 00:06:17,080 hanya melihat smiley merah. 109 00:06:17,080 --> 00:06:20,380 Tetapi mengambil menyelam lebih dalam, kita akan melihat bahwa struktur 110 00:06:20,380 --> 00:06:22,340 itu hanya piksel. 111 00:06:22,340 --> 00:06:25,880 Kami memiliki piksel putih, dan kemudian piksel merah. 112 00:06:25,880 --> 00:06:31,000 Putih, ffffff, dan kemudian semua piksel merah saya sudah berwarna untuk Anda 113 00:06:31,000 --> 00:06:35,440 di sini, dan Anda melihat bahwa mereka 0000ff. 114 00:06:35,440 --> 00:06:39,760 Nol biru, hijau nol, dan merah penuh. 115 00:06:39,760 --> 00:06:45,350 Dan karena tersenyum adalah delapan piksel lebar, kita tidak memiliki bantalan apapun. 116 00:06:45,350 --> 00:06:47,360 Baik. 117 00:06:47,360 --> 00:06:53,310 >> Jadi jika saya harus menetapkan nilai yang berbeda ke RGBTRIPLE dan saya ingin 118 00:06:53,310 --> 00:06:58,350 membuatnya hijau, maka apa yang akan saya lakukan adalah Saya akan mendeklarasikan RGBTRIPLE, bernama 119 00:06:58,350 --> 00:07:02,660 tiga, dan kemudian untuk mengakses setiap byte dalam struct yang saya 120 00:07:02,660 --> 00:07:04,030 akan menggunakan operator dot. 121 00:07:04,030 --> 00:07:08,430 Jadi triple.rgbtBlue, saya bisa menetapkan bahwa untuk 0. 122 00:07:08,430 --> 00:07:13,460 Green saya dapat menetapkan ke penuh - setiap nomor, benar-benar, antara 0 dan ff. 123 00:07:13,460 --> 00:07:15,470 Dan kemudian merah, saya juga akan mengatakan 0. 124 00:07:15,470 --> 00:07:19,160 Jadi itu memberi saya pixel hijau. 125 00:07:19,160 --> 00:07:23,030 >> Selanjutnya, bagaimana jika saya ingin memeriksa nilai sesuatu? 126 00:07:23,030 --> 00:07:27,250 Aku bisa memiliki sesuatu yang memeriksa apakah nilai tiga itu adalah rgbtBlue 127 00:07:27,250 --> 00:07:31,080 ff dan kemudian cetak, "Aku merasa biru! ", sebagai hasilnya. 128 00:07:31,080 --> 00:07:35,640 Sekarang, itu tidak berarti bahwa pixel berwarna biru, kan? 129 00:07:35,640 --> 00:07:40,060 Karena nilai-nilai hijau dan merah pixel juga bisa memiliki non-0 nilai. 130 00:07:40,060 --> 00:07:43,470 Semua ini berarti bahwa, dan semua yang ini memeriksa adalah 131 00:07:43,470 --> 00:07:45,610 untuk warna biru penuh. 132 00:07:45,610 --> 00:07:50,050 Tapi semua piksel juga bisa parsial nilai warna, seperti ini 133 00:07:50,050 --> 00:07:52,180 Contoh berikutnya di sini. 134 00:07:52,180 --> 00:07:55,400 >> Ini sedikit lebih sulit untuk melihat apa gambar ini sekarang. 135 00:07:55,400 --> 00:08:00,320 Ini terlihat sedikit lebih seperti clue.bmp bahwa Anda akan diberikan. 136 00:08:00,320 --> 00:08:03,600 Sekarang, secara fisik, Anda mungkin memecahkan ini, karena ada banyak merah, oleh 137 00:08:03,600 --> 00:08:07,040 memegang layar merah untuk gambar sehingga bahwa warna lainnya dapat muncul. 138 00:08:07,040 --> 00:08:10,968 Jadi bagaimana kita meniru ini dengan c? 139 00:08:10,968 --> 00:08:15,640 Yah, kita mungkin menghapus semua merah dari gambar seluruhnya. 140 00:08:15,640 --> 00:08:21,870 Dan untuk melakukan itu kita akan mengatur setiap nilai merah pixel untuk 0. 141 00:08:21,870 --> 00:08:25,020 Dan sehingga gambar akan terlihat sedikit sedikit seperti ini, di mana kita tidak memiliki merah 142 00:08:25,020 --> 00:08:26,300 apapun. 143 00:08:26,300 --> 00:08:29,390 >> Kita bisa melihat pesan tersembunyi a sedikit lebih jelas sekarang. 144 00:08:29,390 --> 00:08:31,730 Ini wajah tersenyum lain. 145 00:08:31,730 --> 00:08:33,870 Atau mungkin kita bisa menggunakan metode lain. 146 00:08:33,870 --> 00:08:36,480 Mungkin, kita bisa mengidentifikasi semua piksel merah - 147 00:08:36,480 --> 00:08:41,100 yaitu, semua piksel dengan 0 biru, hijau 0, dan 0 merah - 148 00:08:41,100 --> 00:08:43,169 dan mengubah mereka menjadi putih. 149 00:08:43,169 --> 00:08:45,470 Dan gambar kita mungkin terlihat sesuatu seperti ini. 150 00:08:45,470 --> 00:08:48,250 Sedikit lebih mudah untuk melihat. 151 00:08:48,250 --> 00:08:51,170 >> Ada banyak cara lain untuk mengungkap pesan rahasia juga, 152 00:08:51,170 --> 00:08:53,730 berurusan dengan manipulasi warna. 153 00:08:53,730 --> 00:08:57,050 Mungkin Anda dapat menggunakan salah satu metode yang saya sebutkan di atas. 154 00:08:57,050 --> 00:08:59,600 Dan selain itu, Anda mungkin ingin untuk meningkatkan beberapa warna 155 00:08:59,600 --> 00:09:02,620 dan membawa mereka keluar. 156 00:09:02,620 --> 00:09:06,190 >> Jadi sekarang kita telah mengubah pixel warna, selanjutnya kita hanya perlu menulis mereka 157 00:09:06,190 --> 00:09:08,500 ke scanline tersebut, pixel demi pixel. 158 00:09:08,500 --> 00:09:11,860 Dan sekali lagi, Anda akan ingin melihat ke belakang untuk copy.c, jika Anda belum disalin 159 00:09:11,860 --> 00:09:18,170 sudah, dan melihat fwrite yang fungsi, yang mengambil data, pointer 160 00:09:18,170 --> 00:09:23,230 ke struct yang berisi byte bahwa Anda membaca dari, ukuran 161 00:09:23,230 --> 00:09:26,610 item, jumlah item, dan kemudian outptr ini - 162 00:09:26,610 --> 00:09:29,450 tujuan file tersebut. 163 00:09:29,450 --> 00:09:34,010 >> Setelah Anda menulis dalam pixel, Anda akan juga harus menulis di padding. 164 00:09:34,010 --> 00:09:34,970 Apa bantalan? 165 00:09:34,970 --> 00:09:38,670 Nah, setiap pixel rgbt adalah tiga byte panjang. 166 00:09:38,670 --> 00:09:43,670 Tapi, yang scanline untuk gambar bitmap harus kelipatan dari empat byte. 167 00:09:43,670 --> 00:09:47,650 Dan jika jumlah piksel bukanlah kelipatan empat, maka kita perlu menambahkan 168 00:09:47,650 --> 00:09:48,880 Padding ini. 169 00:09:48,880 --> 00:09:51,420 Padding hanya diwakili oleh 0s. 170 00:09:51,420 --> 00:09:54,380 Jadi, bagaimana kita menulis, atau membaca ini? 171 00:09:54,380 --> 00:09:59,280 Nah, ternyata bahwa Anda tidak bisa Padding sebenarnya fread, tetapi Anda dapat 172 00:09:59,280 --> 00:10:00,970 menghitungnya. 173 00:10:00,970 --> 00:10:04,400 >> Dalam kasus ini, petunjuk dan putusan memiliki lebar yang sama, sehingga 174 00:10:04,400 --> 00:10:05,910 padding sama. 175 00:10:05,910 --> 00:10:09,370 Dan padding, karena Anda akan melihat di copy.c, dihitung 176 00:10:09,370 --> 00:10:11,790 dengan formula di bawah - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth kali sizeof (RGBTRIPLE) akan memberi kita berapa banyak byte bmp tersebut 178 00:10:16,690 --> 00:10:18,280 telah di setiap baris. 179 00:10:18,280 --> 00:10:21,890 Dari sana, modulos dan subtractions dengan 4 dapat menghitung berapa 180 00:10:21,890 --> 00:10:25,610 banyak byte harus ditambahkan sehingga beberapa byte pada 181 00:10:25,610 --> 00:10:27,250 setiap baris adalah empat. 182 00:10:27,250 --> 00:10:30,490 >> Sekarang bahwa kita memiliki rumus untuk berapa banyak bantalan yang kita butuhkan, sekarang 183 00:10:30,490 --> 00:10:31,610 kita bisa menulis. 184 00:10:31,610 --> 00:10:34,080 Sekarang, saya sebutkan sebelumnya, padding hanya 0s. 185 00:10:34,080 --> 00:10:39,730 Jadi dalam hal ini, kami hanya menempatkan char, dalam hal ini 0, ke kami 186 00:10:39,730 --> 00:10:41,710 outptr - outfile kami. 187 00:10:41,710 --> 00:10:47,530 Sehingga hanya bisa fputc 0, koma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Jadi, sementara kita sudah membaca ke kami File, file I / O telah terus melacak kami 189 00:10:52,400 --> 00:10:57,440 posisi dalam file-file dengan sesuatu disebut indikator posisi file. 190 00:10:57,440 --> 00:10:59,350 Anggap saja sebagai kursor. 191 00:10:59,350 --> 00:11:03,550 Pada dasarnya, uang muka setiap kali bahwa kita fread, tapi kita harus 192 00:11:03,550 --> 00:11:05,671 kontrol atas itu, juga. 193 00:11:05,671 --> 00:11:11,030 >> Untuk memindahkan indikator posisi file, Anda dapat menggunakan fungsi fseek. 194 00:11:11,030 --> 00:11:15,600 Dimana inptr mewakili file pointer bahwa Anda sedang mencari in, 195 00:11:15,600 --> 00:11:20,370 jumlah adalah jumlah byte yang ingin memindahkan kursor, dan kemudian dari 196 00:11:20,370 --> 00:11:23,470 berkaitan dengan titik referensi dari mana kursor Anda. 197 00:11:23,470 --> 00:11:26,770 Jika Anda lulus dalam SEEK_CUR, bahwa mewakili arus 198 00:11:26,770 --> 00:11:28,100 posisi dalam file. 199 00:11:28,100 --> 00:11:31,020 Atau Anda dapat menggunakan beberapa parameter lainnya. 200 00:11:31,020 --> 00:11:35,400 Jadi, kita mungkin ingin menggunakan fseek untuk melewati lebih padding dari dalam file. 201 00:11:35,400 --> 00:11:39,410 Dan lagi, jika Anda terjebak, ada contoh bahwa dalam copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Jadi sekarang kita telah membuka file tersebut, petunjuk, dan putusan. 203 00:11:43,260 --> 00:11:46,450 Kami telah memperbarui info header untuk vonis kita, karena setiap 204 00:11:46,450 --> 00:11:48,730 bitmap membutuhkan header. 205 00:11:48,730 --> 00:11:52,280 Kami telah kemudian dibaca ke dalam petunjuk ini scanline, pixel by pixel, mengubah 206 00:11:52,280 --> 00:11:55,210 setiap warna yang diperlukan, dan menulis mereka ke dalam 207 00:11:55,210 --> 00:11:57,340 putusan, pixel demi pixel. 208 00:11:57,340 --> 00:12:01,550 Setelah Anda membuka putusan, Anda dapat melihat siapa pelakunya, atau apa rahasia 209 00:12:01,550 --> 00:12:02,850 pesan. 210 00:12:02,850 --> 00:12:05,550 Nama saya adalah Zamyla, dan ini adalah cerita detektif. 211 00:12:05,550 --> 00:12:12,864