[音楽再生] ZAMYLA CHAN:それはミススカーレットだった 燭台付き。 推理小説? まあ、我々は見つけるつもりだ。 ボードゲームの手がかりでは、かもしれない 物理的な赤のイメージを与えられる。 そのイメージは非常に赤で、 むら、そしてあなたの仕事である 隠されたメッセージを明らかにした。 通常、あなたは、赤を備えている 虫眼鏡、または赤の画面へ その隠されたメッセージを明らかにした。 まあ、我々はそれを模倣しようとしている。 推理小説では、ビットマップイメージを所与いる それは、非常にむらや赤に見える して、推理小説プログラムを実行 隠されたメッセージを明らかにすること。 それでは、手順にこれを破るみましょう。 まず、ファイルを開きたい - あなたが与えられていることを手掛かり。 そして、その後も作成 評決のビットマップファイル。 その後、ビットマップを更新する 評決の出力ファイルに対して情報ヘッダー。 後でその上でより多くの。 そして、あなたはに読み込むしようとしている 手掛かり、スキャンライン、ピクセルごと、 ある画素の色を変化させる 必要に応じて、書き込み 評決にそれら - にピクセルバイピクセル 評決走査線。 どのように我々はこのことについてだろ始めるのですか? さて、幸運なことに、我々はそれなのにがある 流通コード内。 そして、これは証明するために起こっている 私たちに非常に便利。 それなのには、ファイルを開くように読み込む その後INFILEのヘッダ、および更新 出力ファイルのヘッダー。 そして、それは各画素を読み出す スキャンライン、ピクセルごと、その後、 そのピクセルは、出力ファイルに書き込みます。 だから、あなたの最初のステップは、かもしれない 次のことを実行するようになる 端末内のコマンド - CPそれなのにwhodunit.c。 これはのコピーを作成します それなのにwhodunit.cという。 オープンするので、私たちの最初のステップ ファイルには、よく、正確なあります copy.c.でそのレプリカ だから私はそれを見て、あなたを残しておきます。 私たちはこのPSETで扱っていることです。 ファイルI / O、基本的にファイルを取って、 リーディング、ライティング、それらを編集する。 どのようにしてファイルを開くのですか? さて、あなたは、ファイルを宣言するつもりだ ポインタしてから、呼び出し 関数fopen。 パスを渡すか、その名 ファイルを保存し、希望するモード インチ、そのファイルを開きます Rを渡すと開きます 読み込み用foo.bmp。 一方、Wを渡すとのfopenます ファイルを書き込み用にオープンbar.bmp、および 実際にそれを編集する。 だから今我々は、ファイルを開いたことを 次のステップでは、ヘッダー情報を更新することです 出力ファイルのため。 ヘッダー情報は何ですか? さて、最初に我々は知っている必要があります どのようなビットマップである。 ビットマップは単純です バイトの配置。 そして、彼らは、このファイルで宣言されている ここでは、bmp.h、の束と どのようなビットマップの情報 実際に作られている。 しかし、私たちが本当に気にすることはあり ちょうどここのビットマップファイルヘッダ、および こちらにビットマップ情報ヘッダー。 ヘッダはいくつで構成されている 非常に有用であることを証明する変数。 あるbiSizeImageがあり、 バイト単位での画像の合計サイズ。 そして、これは、画素とパディングが含まれています。 パディングは非常に重要ですが、 我々はその以降に取得します。 BiWidthは、幅を表す ピクセル単位で画像マイナスパディング。 のbiHeightも、その後の高さである ピクセル単位で画像の。 してからBITMAPFILEHEADERと BITMAPINFOHEADER、私が述べたように 以前、それらが表現されます 構造体として。 だから、あなたは、ファイル·ヘッダにアクセスすることはできません 自体はできますが、ために取得したいと思う 内部のそれらの変数。 [OK]をクリックします。 では、どのようにヘッダー情報を更新すればよいですか? さて、最初に我々は我々かどうかを確認する必要があります から任意の情報を変更する必要が にINFILE、手掛かり、 出力ファイル、評決。 何でも、この場合は変更していますか? まあ、それは実際には、我々が行っているため、 ただ色を変えることができます。 我々は、ファイルを変更するつもりはない サイズ、画像サイズ、幅、 または高さ。 だから、今では、すべての権利だ ただ、各ピクセルをコピーする。 [OK]をクリックします。 だから今のはどうやって実際に見てみましょう ファイルからのすべてのピクセルを読み取ることができます。 別のファイルI / O機能 遊びに来る - 関数fread。 これは、構造体へのポインタを取り込み つまり、そのバイトが含まれています あなたが読んでいる。 だから、その中に読んでいる。 そして、あなたはある、サイズを渡す あなたのすべての要素のサイズ 読みたい。 ここでは、関数sizeof 便利になるだろう。 その後は、番号を渡している の要素の数を表す 読み込むサイズ。 された後、最終的には、INPTR、 あなたがしているファイルポインタ から読むつもり。 そのように、これらの要素の全てが内側にある INPTR彼らはデータになるだろう。 少し例を見てみましょう。 私は、データ2の犬に読み込みたい場合は、 まあ、私はそれを2つの方法のいずれかを行うことができます。 私はどちらかの大きさの二つの物体で読むことができます 私INPTRからの犬、または私が読むことができます 1オブジェクト2の犬の大きさ。 だから、見ている方によって あなたはサイズと数を配置することに、 同じバイト数で読み取ることができる。 だから今、のは変更してみましょう 我々が必要とするように、画素の色。 もう一度bmp.hを見た場合、 あなたが一番下に、その表示されます RGBTRIPLEsは、別の構造体である場合、 それらは3バイトで構成されている。 一、rgbtBlue、rgbtGreen、およびrgbtRed。 したがって、これらの各々は、量を表す 青、緑の量、および このピクセル内部の赤の量、どこで それぞれの量は次式で表される。 進数。 だから、FF0000は青の色になります、 それが青から行くので、 赤、緑。 して、すべてのFさんは、白になります。 これ、のはsmiley.bmpを見てみましょう あなたのディストリビューションのコードを持っている。 あなただけのイメージで開く場合 見る人、あなたはよ ちょうど赤スマイリーを参照してください。 しかし、我々はつもりで深いダイビングを取る 構造が分かり それだけのピクセルです。 我々は、白画素を有し、 した後、赤色画素。 白、FFFFFFし、その後のすべて 私はあなたのために着色した赤画素 ここに、あなたは彼らが0000FFいることがわかります。 ゼロ青、ゼロ、緑、赤のフル。 とスマイリーは8ピクセル幅であるため、 我々はすべてのパディングを持っていません。 わかりました。 だから私は、別の値を代入した場合 RGBTRIPLEへと私はしたかった それは緑にする、私はどうなるのかである 私は名前のRGBTRIPLEを宣言します トリプルしてから、すべてのアクセスする その構造体の中のバイトのI ドット演算子を使用します。 そうtriple.rgbtBlue、私がすることができます 0にすることを割り当てる。 緑私はフルに割り当てることができます - 任意の 数、実際に、0からFFまで。 して、赤、私はまた、0を言おうとしています。 それでは、それは私に緑色画素を与えます。 次に、私がチェックし、何をしたい場合 何かの価値? 私がチェックする何かを持っている可能性が 三重のrgbtBlue値があるかどうか FF [印刷、「私が感じている ブルー! "、結果として。 今、それは必ずしも意味するものではありません ピクセルは、右、青であることを? ピクセルの緑と赤の値理由 また、非0の値を持つことができます。 このことは、すべて、およびすべてのこと これはチェックされる フル青色用。 しかし、すべての画素は、部分的な可能性がある このような色の値、 ここで、次の例。 見て少し難しくそれだ この画像は今どうなっているか。 これはもう少しのようになります あなたが与えられるだろうとclue.bmp。 今、物理的には、これを解決するかもしれません、 によって、赤が多数ありますので、 その画像に赤い画面が表示され保持 他の色が表示されることができること。 では、どのようにC言語でこれを模倣するのですか? まあ、我々はすべての赤を取り除くかもしれません イメージとは全く。 だから我々は、すべての設定だろうと行うには 0へのピクセルの赤の値。 だからイメージが少しなり 我々は赤を持っていないこのようなビット、 全く。 私たちは隠されたメッセージAを見ることができます もう少し明確になりました。 それは別のスマイリーフェイスです。 または多分私達は別の方法を使用することができます。 多分、我々は、識別することができる 赤色画素のすべて - つまり、画素の全てである 0青、0、緑、赤の0 - と白のものに変更します。 そして、私たちのイメージが見えるかもしれません このようなもの。 見て少し簡単に。 明らかに他の方法はたくさんあり​​ます 秘密のメッセージだけでなく、 カラー操作を扱う。 たぶん、あなたはいずれかの方法を使用する場合があります Iは、上記のこと。 そしてさらに、お勧めします いくつかの色を強化する それらを引き出す。 だから今我々は、ピクセルを変更したことを 色は、次の我々はそれらを記述する必要があります スキャンラインの中で、画素ごと。 そして再び、あなたは振り返るしたいと思う あなたはコピーしていない場合には、それなのにする それはすでに、とfwriteを見る データを取る関数、ポインタ バイトが含まれている構造体へ あなたのサイズから読んでいることを 項目、項目数、 してからOUTPTR - これらのファイルの送信先。 あなたはピクセル単位で記述した後は、よ また、パディングに記述する必要があります。 パディングとは何ですか? さて、すべてのRGBTピクセル 3バイトの長さ。 しかし、ビットマップイメージのスキャンライン 4バイトの倍数である必要があります。 画素数ではない場合 4の倍数にし、我々が追加する必要があります このパディング。 パディングがちょうど0で表されます。 だから、どのように書くか、これを読んでいますか? まあ、それはそれができないことが判明 実際のfreadパディングが、次のことが可能 それを計算する。 この場合には、手がかりと評決 同じ幅を持っているので、 パディングは同じです。 パディングは、次のように表示されますように それなのにで、算出される 以下の式 - bi.biWidth回のsizeof(RGBTRIPLE)意志 何バイトBMPたちを与える すべての行にあります。 そこから、モジュロおよび減算 4でどのように計算することができます そのように多くのバイトが追加する必要があります 上のバイトの倍数 すべての行は4です。 今、私たちは式を持っていることを 我々が必要とするどのくらいのパディング、今 我々はそれを書くことができます。 今、私は前に述べた、 パディングはちょうど0である。 だから、その場合には、我々だけで入れている 私たちに、この場合0のchar、、 OUTPTR - 私たちの出力ファイル。 だから、それはただのfputcすることができます 0コンマOUTPTR。 そこで、我々は我々の中に読んでてきたしながら、 ファイルは、ファイルI / Oは、追跡を続けてきた私たちの 何かでそれらのファイルの位置 ファイル位置指示子と呼ばれる。 カーソルと考えてください。 基本的には、毎回進める 私たちは、FREADが、我々は持っていることを あまりにも、それを制御。 ファイル位置指示子を移動するには、 あなたは、関数fseek関数を使用することができます。 INPTRはファイルを表し あなたが探しているいるのポインタ、 量は、その使用バイト数です カーソルを移動したい、としてから 基準点に関し カーソルがどこにあるから。 あなたがSEEK_CURに渡すと、その 電流を表す ファイル内の位置。 または、他のいくつかのパラメータを使用することができます。 そこで、我々はスキップするfseek関数を使用することもできます 内のファイルのパディング以上。 あなたが立ち往生している場合には、再び、そこ copy.c.のそのの例 だから今我々は、ファイルを開いた、 手がかりと評決。 私たちは、ヘッダー情報を更新しました 私たちの評決は、すべての理由 ビットマップは、ヘッダーを必要とします。 それから、手がかりのに読んだ スキャンライン、ピクセルバイピクセル、変更する 必要に応じて、すべての色、 にそれらを書くこと 評決、ピクセルバイピクセル。 あなたは評決を開くと、あなたは誰を見ることができます 犯人、またはどのような秘密 メッセージです。 私の名前はZamylaで、 これは推理小説だった。