>> [音楽再生]
>> 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で、 これは推理小説だった。