1 00:00:00,000 --> 00:00:09,500 >> [音樂播放] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA陳:這是思嘉小姐 與燭台。 3 00:00:12,350 --> 00:00:13,560 誰是兇手? 4 00:00:13,560 --> 00:00:15,030 好了,我們要找出答案。 5 00:00:15,030 --> 00:00:20,870 在棋盤遊戲線索,你可能 給出一個物理紅色圖像。 6 00:00:20,870 --> 00:00:24,120 而且圖像很紅和 參差不齊,而你的工作是 7 00:00:24,120 --> 00:00:25,490 揭示了隱藏的消息。 8 00:00:25,490 --> 00:00:29,740 通常你用紅色正在提供 放大鏡,或紅色屏幕 9 00:00:29,740 --> 00:00:31,410 揭示隱藏的消息。 10 00:00:31,410 --> 00:00:33,340 嗯,我們要去模仿。 11 00:00:33,340 --> 00:00:37,960 >> 在偵探小說,你給一個位圖圖像 這看起來非常參差不齊,紅色, 12 00:00:37,960 --> 00:00:43,430 然後運行偵探小說程序 露出一個隱藏的信息。 13 00:00:43,430 --> 00:00:45,650 >> 因此,讓我們打破這種分成幾個步驟。 14 00:00:45,650 --> 00:00:50,390 首先,你要打開的文件 - 你已經被賦予了線索。 15 00:00:50,390 --> 00:00:53,880 然後還創建 判決書位圖文件。 16 00:00:53,880 --> 00:00:58,240 然後,你要更新的位圖 頭對於判決結果輸出文件信息。 17 00:00:58,240 --> 00:00:59,920 更多的後來。 18 00:00:59,920 --> 00:01:04,319 然後你要讀入 線索,掃描,逐像素, 19 00:01:04,319 --> 00:01:07,320 改變像素顏色 必要時,和寫作 20 00:01:07,320 --> 00:01:08,960 那些進入判決 - 21 00:01:08,960 --> 00:01:12,000 逐個像素進 判決書掃描線。 22 00:01:12,000 --> 00:01:13,780 >> 我們如何開始準備這件事? 23 00:01:13,780 --> 00:01:16,940 好了,幸運的是,我們有copy.c 在分配代碼。 24 00:01:16,940 --> 00:01:21,240 並且這將證明 非常有用的給我們。 25 00:01:21,240 --> 00:01:29,700 Copy.c打開一個文件,讀取該 INFILE的頭,然後更新 26 00:01:29,700 --> 00:01:31,070 輸出文件的標頭。 27 00:01:31,070 --> 00:01:37,010 然後將其讀出的每個像素中的 掃描線,逐個像素,然後 28 00:01:37,010 --> 00:01:42,390 寫道像素到輸出文件。 29 00:01:42,390 --> 00:01:45,020 >> 所以,你的第一個步驟可能 可以運行下面的 30 00:01:45,020 --> 00:01:46,420 命令,在終端 - 31 00:01:46,420 --> 00:01:50,270 CP copy.c whodunit.c。 32 00:01:50,270 --> 00:01:55,320 這將創建的副本 copy.c命名whodunit.c。 33 00:01:55,320 --> 00:01:58,320 所以我們的第一步打開 文件,好了,有一個確切的 34 00:01:58,320 --> 00:02:00,070 的,在copy.c.副本 35 00:02:00,070 --> 00:02:03,360 所以,我將離開你看看那個。 36 00:02:03,360 --> 00:02:07,860 >> 我們現在在這個PSET處理的 文件I / O,基本回吐文件, 37 00:02:07,860 --> 00:02:10,229 閱讀,寫作,編輯它們。 38 00:02:10,229 --> 00:02:12,650 你怎麼先打開一個文件? 39 00:02:12,650 --> 00:02:16,800 好吧,你要申報文件 指針,然後調用 40 00:02:16,800 --> 00:02:18,670 功能打開。 41 00:02:18,670 --> 00:02:23,150 通過在路徑中,或者該名稱 文件,然後您需要的模式 42 00:02:23,150 --> 00:02:24,700 英寸打開該文件 43 00:02:24,700 --> 00:02:28,620 通過在R將打開 foo.bmp閱讀。 44 00:02:28,620 --> 00:02:35,670 而FOPEN與傳遞一個W將 開放bar.bmp,寫文件和 45 00:02:35,670 --> 00:02:37,020 其實編輯它。 46 00:02:37,020 --> 00:02:41,970 >> 所以,現在,我們已經打開的文件,我們 下一步是更新的頭信息 47 00:02:41,970 --> 00:02:43,230 為輸出文件。 48 00:02:43,230 --> 00:02:44,610 什麼是頭信息? 49 00:02:44,610 --> 00:02:48,160 嗯,首先我們需要知道 什麼是位圖。 50 00:02:48,160 --> 00:02:51,000 位圖只是一個簡單的 字節排列。 51 00:02:51,000 --> 00:02:55,480 他們在這個文件正在申報 在這裡,在bmp.h,帶著一幫 52 00:02:55,480 --> 00:02:58,610 一個什麼樣的位圖信息 實際上是做出來的。 53 00:02:58,610 --> 00:03:05,730 但是,我們真正關心的是什麼 位圖文件頭,就在這裡,和 54 00:03:05,730 --> 00:03:08,460 位圖信息頭,在​​這裡。 55 00:03:08,460 --> 00:03:13,170 頭是由一對夫婦 變量將證明是非常有用的。 56 00:03:13,170 --> 00:03:18,400 有成員biSizeImage,這是 以字節為單位的圖像的總大小。 57 00:03:18,400 --> 00:03:20,890 這包括像素和填充。 58 00:03:20,890 --> 00:03:24,210 填充是非常重要的,但 我們將在稍後。 59 00:03:24,210 --> 00:03:30,000 >> BiWidth代表的寬度 圖像中的像素減去填充。 60 00:03:30,000 --> 00:03:34,220 BiHeight然後還高度 以像素為單位的圖像。 61 00:03:34,220 --> 00:03:38,240 然後BITMAPFILEHEADER和 BITMAPINFOHEADER,正如我所說 62 00:03:38,240 --> 00:03:40,900 早些時候,這些都代表 作為結構。 63 00:03:40,900 --> 00:03:45,410 所以,你不能訪問該文件頭 本身,而是你要得到 64 00:03:45,410 --> 00:03:47,370 這些變量裡面。 65 00:03:47,370 --> 00:03:48,170 >> 確定。 66 00:03:48,170 --> 00:03:50,600 那麼,我們如何更新的頭信息? 67 00:03:50,600 --> 00:03:54,020 嗯,首先我們要看看我們是否 需要從改變任何信息 68 00:03:54,020 --> 00:03:58,480 infile中的線索,到 OUTFILE,判決。 69 00:03:58,480 --> 00:04:00,250 是什麼改變這種情況? 70 00:04:00,250 --> 00:04:04,320 好吧,其實不是,因為我們要去 要只是改變了顏色。 71 00:04:04,320 --> 00:04:07,550 我們不會被改變文件 的大小,圖像的大小,寬度, 72 00:04:07,550 --> 00:04:08,310 或高度。 73 00:04:08,310 --> 00:04:14,010 所以你所有的權利現在 只是複製每個像素。 74 00:04:14,010 --> 00:04:14,840 >> 確定。 75 00:04:14,840 --> 00:04:20,720 所以,現在讓我們來看看如何實際我們 可以從文件中讀取每一個像素。 76 00:04:20,720 --> 00:04:23,640 另一個文件I / O功能 將開始發揮作用 - 77 00:04:23,640 --> 00:04:24,700 FREAD。 78 00:04:24,700 --> 00:04:28,440 這需要在一個指向該結構 將包含字節 79 00:04:28,440 --> 00:04:30,110 你正在閱讀。 80 00:04:30,110 --> 00:04:31,890 所以,你正在閱讀到這一點。 81 00:04:31,890 --> 00:04:36,090 然後你傳遞一個大小,這是 每個元素的大小,你 82 00:04:36,090 --> 00:04:37,360 想讀。 83 00:04:37,360 --> 00:04:40,640 這裡,函數sizeof 會派上用場。 84 00:04:40,640 --> 00:04:45,570 然後,你將在數量上,這 表示的元素的數目 85 00:04:45,570 --> 00:04:47,480 大小來讀取。 86 00:04:47,480 --> 00:04:51,180 然後最後,inptr,這是 你是將文件指針 87 00:04:51,180 --> 00:04:52,530 從去閱讀。 88 00:04:52,530 --> 00:04:58,650 因此,所有這些元素都在裡面 inptr和他們要的數據。 89 00:04:58,650 --> 00:05:01,660 >> 讓我們看一個小例子。 90 00:05:01,660 --> 00:05:07,590 如果我想讀入數據兩隻狗, 好了,我可以做到這一點的兩種方法之一。 91 00:05:07,590 --> 00:05:15,250 我可以讀大小的兩個對象 從我inptr的狗,或者我可以讀 92 00:05:15,250 --> 00:05:19,280 在一個對象的兩個狗的大小。 93 00:05:19,280 --> 00:05:23,580 所以你看到,這取決於方式 你安排的大小和數量,您 94 00:05:23,580 --> 00:05:25,840 可以在相同的字節數讀出。 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> 所以,現在,讓我們來改變 因為我們需要的像素顏色。 97 00:05:33,020 --> 00:05:37,320 如果你看看在bmp.h一遍,然後 你會看到在底部 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs是另一種結構,其中 它們是由三個字節。 99 00:05:42,920 --> 00:05:49,220 一,rgbtBlue,rgbtGreen和rgbtRed。 100 00:05:49,220 --> 00:05:52,480 所以每一個都代表了額 藍色,綠色的數量,並且 101 00:05:52,480 --> 00:05:57,250 該像素內金額紅色的,其中 每個量是由一個表示 102 00:05:57,250 --> 00:05:58,670 十六進制數。 103 00:05:58,670 --> 00:06:04,370 >> 所以FF0000將是一個藍色的顏色, 因為它從藍色, 104 00:06:04,370 --> 00:06:05,850 綠色,紅色。 105 00:06:05,850 --> 00:06:09,300 然後全F的地址將是白色的。 106 00:06:09,300 --> 00:06:13,440 讓我們來看看smiley.bmp,這 你有你的分銷代碼。 107 00:06:13,440 --> 00:06:15,690 如果您在短短的一個圖像打開它 瀏覽器,那麼你會 108 00:06:15,690 --> 00:06:17,080 剛看到一個紅色的笑臉。 109 00:06:17,080 --> 00:06:20,380 但考慮更深的下潛中,我們將 見,該結構 110 00:06:20,380 --> 00:06:22,340 它僅僅是像素。 111 00:06:22,340 --> 00:06:25,880 我們有白色像素, 然後紅色像素。 112 00:06:25,880 --> 00:06:31,000 白色,FFFFFF,然後將所有的 紅色像素,我在上色為你 113 00:06:31,000 --> 00:06:35,440 在這裡,你可以看到他們是0000FF。 114 00:06:35,440 --> 00:06:39,760 藍零,零綠,全紅。 115 00:06:39,760 --> 00:06:45,350 而且,由於笑臉是8個像素寬, 我們沒有任何填充。 116 00:06:45,350 --> 00:06:47,360 好的。 117 00:06:47,360 --> 00:06:53,310 >> 所以,如果我是分配不同的值 到RGBTRIPLE,我想 118 00:06:53,310 --> 00:06:58,350 使其綠色,那麼我會做的是 我想聲明一個RGBTRIPLE,命名 119 00:06:58,350 --> 00:07:02,660 三,然後進入每 該結構我內字節 120 00:07:02,660 --> 00:07:04,030 會使用點運算符。 121 00:07:04,030 --> 00:07:08,430 所以triple.rgbtBlue,我可以 指派為0。 122 00:07:08,430 --> 00:07:13,460 綠色的,我可以把它分配給全 - 任何 號,說真的,介於0和FF。 123 00:07:13,460 --> 00:07:15,470 再紅,我也想說0。 124 00:07:15,470 --> 00:07:19,160 這樣的話,讓我一個綠色像素。 125 00:07:19,160 --> 00:07:23,030 >> 接下來,如果我要檢查什麼 東西的價值? 126 00:07:23,030 --> 00:07:27,250 我可以有一些檢查 三重的rgbtBlue值是否為 127 00:07:27,250 --> 00:07:31,080 FF和再打印,“我感覺 藍色的!“,作為一個結果。 128 00:07:31,080 --> 00:07:35,640 現在,這並不一定意味著 該像素是藍色的,對不對? 129 00:07:35,640 --> 00:07:40,060 因為像素的綠色和紅色值 也可具有非0值。 130 00:07:40,060 --> 00:07:43,470 所有這意味著,以及所有 這是檢查是 131 00:07:43,470 --> 00:07:45,610 一個完整的藍色。 132 00:07:45,610 --> 00:07:50,050 但是,所有的像素可能也有部分 顏色值,這樣 133 00:07:50,050 --> 00:07:52,180 這裡在下一個例子。 134 00:07:52,180 --> 00:07:55,400 >> 這是一個有點難以看 這個形象是什麼了。 135 00:07:55,400 --> 00:08:00,320 這看起來更有點像 clue.bmp,你會得到。 136 00:08:00,320 --> 00:08:03,600 現在,身體上,你可能會解決這個問題, 因為有大量的紅,由 137 00:08:03,600 --> 00:08:07,040 拿著一個紅色的屏幕圖像,這樣 那其他顏色可以出現。 138 00:08:07,040 --> 00:08:10,968 那麼,我們如何模仿這種用c? 139 00:08:10,968 --> 00:08:15,640 好了,我們可能會刪除所有紅色 從整個影像。 140 00:08:15,640 --> 00:08:21,870 所以要做到這一點,我們會設置每 像素的紅色值設置為0。 141 00:08:21,870 --> 00:08:25,020 這樣一來,圖像會顯得有點 像這樣,在那裡我們有沒有紅色的位 142 00:08:25,020 --> 00:08:26,300 無論什麼。 143 00:08:26,300 --> 00:08:29,390 >> 我們可以看到隱藏的訊息 更清楚現在點點。 144 00:08:29,390 --> 00:08:31,730 它的另一個笑臉。 145 00:08:31,730 --> 00:08:33,870 或者,也許我們可以用另一種方​​法。 146 00:08:33,870 --> 00:08:36,480 也許,我們可以識別 所有的紅色像素 - 147 00:08:36,480 --> 00:08:41,100 也就是說,所有的像素與 0藍色,綠色0和0紅 - 148 00:08:41,100 --> 00:08:43,169 並改變那些白色。 149 00:08:43,169 --> 00:08:45,470 而我們的圖像看起來可能 這樣的事情。 150 00:08:45,470 --> 00:08:48,250 有一點比較容易看到。 151 00:08:48,250 --> 00:08:51,170 >> 有很多其他的方法來發現 秘密消息為好, 152 00:08:51,170 --> 00:08:53,730 處理的顏色處理。 153 00:08:53,730 --> 00:08:57,050 也許你可能會使用的方法之一 我上面提到的。 154 00:08:57,050 --> 00:08:59,600 ,另外,您可能希望 提升一些顏色 155 00:08:59,600 --> 00:09:02,620 並把那些出。 156 00:09:02,620 --> 00:09:06,190 >> 所以,現在我們已經改變了像素 色彩,接下來我們只需要編寫他們 157 00:09:06,190 --> 00:09:08,500 在到該掃描線,逐個像素。 158 00:09:08,500 --> 00:09:11,860 並再次,你要回頭 到copy.c,如果你還沒有被複製 159 00:09:11,860 --> 00:09:18,170 它已經,並期待在fwrite的 函數,它接受數據,一個指針 160 00:09:18,170 --> 00:09:23,230 到包含該字節的結構 你是從,大小閱讀 161 00:09:23,230 --> 00:09:26,610 的項目,項目的數目, 然後outptr - 162 00:09:26,610 --> 00:09:29,450 這些文件的目的。 163 00:09:29,450 --> 00:09:34,010 >> 當您在像素寫,你會 還必須在填充寫。 164 00:09:34,010 --> 00:09:34,970 什麼是填充? 165 00:09:34,970 --> 00:09:38,670 那麼,每一個像素RGBT 是3字節長。 166 00:09:38,670 --> 00:09:43,670 但是,掃描線為位圖圖像 必須的4個字節的倍數。 167 00:09:43,670 --> 00:09:47,650 如果像素的數目不是 多四個,那麼我們就需要添加 168 00:09:47,650 --> 00:09:48,880 這種填充。 169 00:09:48,880 --> 00:09:51,420 填充,只需0表示。 170 00:09:51,420 --> 00:09:54,380 那麼,我們該如何寫,或讀這個? 171 00:09:54,380 --> 00:09:59,280 嗯,事實證明,你不能 其實用fread填充,但你可以 172 00:09:59,280 --> 00:10:00,970 計算。 173 00:10:00,970 --> 00:10:04,400 >> 在這種情況下,線索和判決 具有相同的寬度,所以 174 00:10:04,400 --> 00:10:05,910 填充是相同的。 175 00:10:05,910 --> 00:10:09,370 和填充,因為你會看到 在copy.c,計算 176 00:10:09,370 --> 00:10:11,790 用下面的公式 - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth倍的sizeof(RGBTRIPLE)會 給我們多少字節的bmp 178 00:10:16,690 --> 00:10:18,280 有每一行中。 179 00:10:18,280 --> 00:10:21,890 從那裡,模數和減法 與4可以計算出 180 00:10:21,890 --> 00:10:25,610 許多字節必須被添加,使得 在字節倍數 181 00:10:25,610 --> 00:10:27,250 每一行是4。 182 00:10:27,250 --> 00:10:30,490 >> 現在,我們有公式 我們多麼需要填充,現在 183 00:10:30,490 --> 00:10:31,610 我們可以寫它。 184 00:10:31,610 --> 00:10:34,080 現在,我之前提到的, 填充僅僅是0。 185 00:10:34,080 --> 00:10:39,730 因此,在這種情況下,我們只是把 一個字符,在這種情況下為0,進入我們 186 00:10:39,730 --> 00:10:41,710 outptr - 我們的輸出文件。 187 00:10:41,710 --> 00:10:47,530 所以這只能說是的fputc 0,逗號outptr。 188 00:10:47,530 --> 00:10:52,400 >> 所以,雖然我們一直在閱讀到我們的 文件,文件I / O一直跟踪我們 189 00:10:52,400 --> 00:10:57,440 在與一些這些文件的位置 調用的文件位置指示器。 190 00:10:57,440 --> 00:10:59,350 把它看成是一個光標。 191 00:10:59,350 --> 00:11:03,550 基本上,它前進的每一次 我們FREAD,但我們有 192 00:11:03,550 --> 00:11:05,671 控制了這一點。 193 00:11:05,671 --> 00:11:11,030 >> 如果要移動的文件位置指示器, 您可以使用函數fseek的。 194 00:11:11,030 --> 00:11:15,600 其中inptr表示文件 您正在尋找的指針, 195 00:11:15,600 --> 00:11:20,370 量的字節數,你 要移動光標,​​然後從 196 00:11:20,370 --> 00:11:23,470 涉及的基準點 從光標所在處。 197 00:11:23,470 --> 00:11:26,770 如果傳入SEEK_CUR,那 表示當前 198 00:11:26,770 --> 00:11:28,100 在文件中的位置。 199 00:11:28,100 --> 00:11:31,020 或者您可以使用其他一些參數。 200 00:11:31,020 --> 00:11:35,400 所以,我們可能要使用FSEEK跳過 在文件中的填充。 201 00:11:35,400 --> 00:11:39,410 再次,如果你堅持,有 的,在copy.c.一個例子 202 00:11:39,410 --> 00:11:43,260 >> 所以,現在我們已經打開的文件, 的線索,並判決。 203 00:11:43,260 --> 00:11:46,450 我們已經更新了頭信息 我們的判決,因為每 204 00:11:46,450 --> 00:11:48,730 位圖需要的標頭。 205 00:11:48,730 --> 00:11:52,280 我們然後讀入線索的 掃描線,逐個像素,改變 206 00:11:52,280 --> 00:11:55,210 每一個顏色的需要,並 寫那些進入 207 00:11:55,210 --> 00:11:57,340 判決,逐像素。 208 00:11:57,340 --> 00:12:01,550 一旦你打開的判決,你可以看到誰 罪魁禍首,還是什麼秘密 209 00:12:01,550 --> 00:12:02,850 消息。 210 00:12:02,850 --> 00:12:05,550 我的名字是Zamyla,並 這是偵探小說。 211 00:12:05,550 --> 00:12:12,864