1 00:00:00,000 --> 00:00:09,500 >> [音楽再生] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN:それはミススカーレットだった 燭台付き。 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 さて、幸運なことに、我々はそれなのにがある 流通コード内。 24 00:01:16,940 --> 00:01:21,240 そして、これは証明するために起こっている 私たちに非常に便利。 25 00:01:21,240 --> 00:01:29,700 それなのには、ファイルを開くように読み込む その後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それなのにwhodunit.c。 32 00:01:50,270 --> 00:01:55,320 これはのコピーを作成します それなのに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 関数fopen。 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 一方、Wを渡すとのfopenます ファイルを書き込み用にオープン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 >> [OK]をクリックします。 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、手掛かり、 出力ファイル、評決。 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 >> [OK]をクリックします。 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 私は、データ2の犬に読み込みたい場合は、 まあ、私はそれを2つの方法のいずれかを行うことができます。 91 00:05:07,590 --> 00:05:15,250 私はどちらかの大きさの二つの物体で読むことができます 私INPTRからの犬、または私が読むことができます 92 00:05:15,250 --> 00:05:19,280 1オブジェクト2の犬の大きさ。 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は、別の構造体である場合、 それらは3バイトで構成されている。 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 トリプルしてから、すべてのアクセスする その構造体の中のバイトのI 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 >> 私たちは隠されたメッセージAを見ることができます もう少し明確になりました。 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 たぶん、あなたはいずれかの方法を使用する場合があります Iは、上記のこと。 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 そして再び、あなたは振り返るしたいと思う あなたはコピーしていない場合には、それなのにする 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 画素数ではない場合 4の倍数にし、我々が追加する必要があります 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 パディングは、次のように表示されますように それなのにで、算出される 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のchar、、 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