[Powered by Google Translate] [チュートリアル - 問題セット4] [Zamylaチャン - ハーバード大学] [これはCS50です。 - CS50.TV] かしこまりました。みなさん、こんにちは、そしてチュートリアル4に歓迎しています。 今日私達のpsetにはフォレンジックです。 フォレンジックは、ビットマップファイルを扱うことを含む本当に楽しいPSETです 罪を犯した人を発見してください。 その後、我々は、いくつかのビットマップファイルのサイズを変更するつもりだ その後、我々はまた、回復と呼ばれる本当に楽しい部分に対処するつもりだ 採用された場合は、基本的にはメモリカードを手渡している ている誰かが誤ってすべてのファイルを削除している、 そして我々は、それらのファイルを回復するよう求められます。 我々はPSETに入る前に、しかし、最初に、私は実際にちょうど皆を祝福したい。 我々は、このコースの中間点で約だ。 クイズ0人が私達の後ろにいて、私たちは途中でいるので、本質的に、pset4にいる。 あなたのpset、PSET0とPSET1に戻って見れば我々は、長い道のりを歩んできました ので、そのことについて自分自身を祝福 そして我々はいくつかの本当に楽しいものに得ようとしている。 だからこのpsetの私たちのツールボックスは、再度、その代わりにsudoにyum-yのアップデートを実行しているの、 あなたは上記のアプライアンスのバージョン17.3とでなら私達はちょうどupdate50を実行することができるしている。 だからupdate50を実行してください - それは、いくつかの小さい文字が、ずっと簡単です - は、アプライアンスの最新バージョンにいることを確認します。 我々はCS50チェックを使用して起動したときに特にそれがupdate50に重要です。 だから、あなたがそれを行うことを確認してください。 このpsetのセクションのすべてのために、 我々はファイルの入力と出力を扱うことになるだろう、ファイルI / O 我々は、配列を処理するプログラムの多くは上に行くことになるだろう ファイルとそのようなことを指して、 ので、我々は本当に身近で慣れていることを確認したい ファイルがどのように入力と出力に扱う。 このpsetの配布コードで、それなのにと呼ばれるファイルです そしてそれは私たちにとって本当に便利にするために何が起こっているか私たちは見つけるつもりだ 我々は終わろうとしているので、実際それなのにファイルをコピー とわずかに問題セットの最初の2つの部分を達成することができるようにそれを変更すること。 それで、私は前に述べたように、我々はビットマップだけでなく、JPEGファイルを扱っている。 だから本当に、それらのファイルがどのように編成されるかの構造を理解する 私たちは本当に構造体に0と1を翻訳することができますどのように 我々は実際に理解し、解釈し、編集できるもの、 それは、本当に重要になるだろう そうJPEGやビットマップファイルに入るとそれらの構造を理解する。 Pset4は、いつものように、質問のセクションから始まります。 それらは、ファイルI / Oに対応し、あなたがそれに慣れるでしょう。 その後、第1回では、ビットマップファイルを指定されていますが、それは、推理小説である それはすべての上に赤い点のような種類のものに見えます。 そして、基本的に我々がやろうとしているこのファイルを取得しており、わずかにそれを編集 我々が読むことができるバージョンに変換します。 本質的には、一度我々は、我々が同じファイルがあるでしょう、終わる を除いて、我々はすべてのそれらの赤いドットで隠さ隠されたメッセージを見ることができるでしょう。 その後、リサイズしてファイルを指定して、プログラムである そして、それは、出力したファイルの名前が与えられた後、同様に番号が与えられ 実際にはその整数値でそのビットマップのサイズを変更します。 それから最後に、我々は回復のpsetを持っています。 我々は、メモリカードが与えられた後、すべての写真を回復するために有している 誤って削除されたこと、 しかし、我々が学ぶように、実際に削除され、ファイルから削除されません; 彼らがファイルにあった場所の私達だけの種類は、失われたが、我々はそれを回復しようとしている。 グレート。だから私は、O /ファイルに入って具体的には、これらは、使用するようになると機能の全リストです。 あなたは既に少しの関数fopen、freadは、とfwriteの基本を見てきましたが、 しかし、我々はそのようなは、fputcなどのI / O機能がいくつかのファイルにさらに見ていくつもりです、 ているあなただけ、一度に1つの文字を書き込む あなた種類前後にファイル位置指示子を動かすのに、fseek、へ その後いくつかの他。しかし、我々は、pset間に少し後でその中に行くつもりです。 そこでまず、私たちはpsetに入る直前に、ファイルI / Oに接続する為に、 ファイルを開くには、例えば、どのようなあなたがしなければならないと、実際にそのファイルへのポインタを設定されています。 だから我々は、FILE *ポインタを持っています。 それは私のINFILEになるだろうので、この場合、私はそれをポインタで呼んでいる。 そして、私は関数fopenして、ファイルの名前を使用するつもりだ その後、私はファイルを扱うことするつもりだするモード。 だから読んで、このケースでは "r"、書き込みのためには "w"と入力し、追加するために "A"があります。 例えば、あなたがINFILEを扱っているときに そしてあなたがしたいすべてが、そこに格納されているビットとバイトを読んで あなたはおそらくあなたのモードとして "r"を使用するつもりだ。 あなたは実際に、新しいファイルを作るの種類を記述したい場合には、 その後、私たちがやろうとしている、我々は新しいファイルを開くつもりです と書き込みのために "w"モードを使用します。 それでは、あなたが実際にファイルに読んでいるときに、構造は次のとおりです。 最初にあなたが読んでいるというバイトが含まれています構造体へのポインタが含まれています。 だから、それはあなたが読んでいることをバイトの最後の場所になるだろう。 その後、どのように多くのバイトは基本的に好きで、サイズを示すようになるだろう あなたのプログラムがファイルにで読み取る必要があり、サイズは基本的に1種の元素であり、 その後、あなたが読みたいと思うどのように多くの要素を指定するつもりです。 そして最後に、あなたは、あなたが読んでいるからどこに知っている必要があります だからそれはあなたの中のポインタになるだろう。 freadがまた書き出し動作に非常によく似ていますので、私は、これらを色分けされ あなたは、正しい順序を使用していることを確認したい場合を除き、 あなたが実際にデータを書き込んだり、ファイルを右から読んでいることを確認してください。 それでは、前と同じように、我々は、素子の大きさだけでなく、要素の数を持っている場合、 次に我々はここで少し周りを再生することができます。 私は犬の構造を持っているので、私は一度に2匹の犬を読んでもらいたいと言う。 私は何を行う可能性は、1つの要素の大きさが1犬の大きさになるだろうと言っている と私は実際にそれらの2つを読んでするつもりです。 代わりに、私は何ができると、私はちょうど1つの要素を読み取るつもり言うさ と1つの要素は、2つの犬の大きさになるということ。 ですから、大きさと数で種の周りを再生することができますどのように類似していることをだ あなたにとってより直感的だものに応じて。 かしこまりました。だから今我々は、書き込みファイルを取得。 どこから読んでいるあなたはどこでファイルを書き込みたい場合は、最初の引数は実際にある。 だから基本的には、ファイルへの書き込みしようとしているデータですが、 それは終わりに外にポインタです。 ですから、PSETを扱っているときに、あなたが混乱しないようにしてください。 多分側で定義側を持っています。 あなたは、例えば、人間のように入力して手動で定義をプルアップしてから、書き出し動作することができます 端末内か、このスライドに戻って参照することができます そしてあなたが右のいずれかを使用していることを確認してください。 だからもう一度、あなたがに書き込むしたいファイルを持ってfwriteの、のために、 それは、最後の引数になるだろう、それは、そのファイルへのポインタになるだろう。 それでは、それは、我々はいつでも、おそらくいくつかのバイトを書いてどのように対処するかだ あなただけのただ一つの文字で書きたいと言う。 我々は、この例の後半で説明するように、ビットマップで我々はそれを使用する必要があります。 我々はfputcは使用することができたときにそれはだが、本質的にはCHRは、一度に1つの文字を入れて ファイル·ポインタに、それはそこに私たちの外にポインタです。 それでは、私たちが求める、またはファイルに書き込むたびに、 ファイルには、我々がどこにあるかを追跡しています。 だから、カーソル、ファイル位置指示子のようなものだ。 そして、私たちは書き込むたびに、またはファイルに再び読み込む それがどこにあるファイルは、実際には、記憶しています ので、それは、カーソルがどこにあるから続行されます。 あなたがしたいときに何かをするために、特定の量で読む、と言う、有益なことができます その後、以下の量で読む しかし、時には我々は戻ったり、実際に一定の基準値から始めると良いでしょう。 それでは、fseek関数は、何をするかは、私たちは、特定のファイルにカーソルを移動することができますされている 特定のバイト数。 そして、私たちがしなければならないと、基準値がどこにあるか指定するだけです。 だからどちらか、カーソルが現在位置から前方または後方に移動し、 あるいは、我々はそれだけで、ファイルの先頭からで移動するように指定することができます またはファイルの終わりから。 そしてあなたは、量に負または正の値を渡すことができます それは一種の前方または後方のいずれかにカーソルを移動します。 我々は他のpsetに入る前に、ファイル上の任意の質問のI / O? オーケー。我々はより多くの例に入るように、質問のための私を停止して自由に感じる。 だから推理小説で、あなたはスライド上のこの赤いほうに似たビットマップファイルを手渡ししている、 そして、それはこのようになります - 赤いドットの束 - そしてあなたが本当に書かれているのか分からない。 あなたが目を細めている場合は、真ん中の内側若干青みがかった色を見ることができるかもしれません。 テキストが格納されている本質的に、それはです。 そこに起こった殺人事件があって、我々はそれをやった人を見つける必要があります。 そのために、我々は、読み取り可能な形式に画像を変換の種類があります。 君たちは今までにこの発生した場合は、時には少しキットがあるだろう どこに赤い膜と虫眼鏡を持っているでしょう。誰ですか?うん。 だから、あなたはこのような何かを手渡されると、虫眼鏡を持っているでしょう 上に赤いフィルムを使用すれば、画像の上にそれを置くと、 と、メッセージがその中に隠されて見ることができるでしょう。 我々は、赤いフィルムと虫眼鏡を持っていないので、代わりに、私たちは一種の私達の自身のを作成しようとしている このPSETインチ そのため、ユーザーは、入力フーダニット、手がかりになるだろう。bmpファイルは、 レッド·ドット·メッセージだinfileに、、ですので、 その後、彼らは私たちのverdict.bmp outfileになるだろうと言っている。 だから、手がかりのような新しいビットマップイメージを作成するために起こっている 私たちは隠されたメッセージを見ることができます読み取り可能な形式で除く。 我々はいくつかの種のビットマップを編集および操作に対処しようとしているので、 私たちは、これらのビットマップファイルの構造へのダイブの種類に行くんだ。 私たちは、講義の中で、これらの少し上に行きましたが、いくつかのより多くのそれらに見ていきましょう。 ビットマップは、本質的に単なるバイトの配列アール ここで我々は、バイトが何を意味している指定した。 そこでここでは、ビットマップ画像の地図のような種類のものである それはいくつかのヘッダファイルから始まると言って、そこにいくつかの情報から始まります。 あなたは、約バイト14番でサイズがビットマップ画像で示されていることがわかり そして、それは続行します。 しかし、その後、私たちは本当にここに興味を持っているのはバイト数54の周り始めています。 我々は、これらのRGBの3を持っています。 何をするだろうと、実際のピクセルの色の値が含まれています。 ヘッダーにいくつかの情報である上記のすべて 画像のサイズ、画像の幅と高さに対応する。 我々は、後で詰め物に入ると、我々が表示されますなぜ画像のサイズ 幅または高さと異なる場合があります。 それでは、これらを表現する - これらのビットマップ画像をバイトのシーケンスである - 大丈夫と言っている私たちは何ができるか、私は覚えているつもりです、そのインデックス14で、 それは我々がこの作業を簡単にするためにやろうとしている代わりにサイズは、例えば、ある場所だが、 構造体でそれをカプセル化しています。 そして私たちは私たちのために作られた2つの構造体、BITMAPFILEHEADERを持っている とBITMAPINFOHEADER、 そして私たちは、そのファイルへのリードはいつでも、デフォルトでは、順番に行くことになるだろう そしてそうするために、それはまた、そのようなbiWidthとbiSizeとして変数に埋めるために起こっている。 そして最後に、すべてのピクセルが3バイトで表現されます。 最初のものは、ピクセルの青の量であり、二つ目は、緑の量です そして最後に、0は本質的に青や緑のないされていない赤の量や赤なし その後ffは最大値です。 これらは16進値です。 それでは我々はFF0000を有していた場合、そのは青の最大量に対応 その後緑と赤なしなので、その私たちに青の画素を与えないであろう全く。 我々は軒並みFFのすべてを持っているならば、それは我々が白画素を持っていることを意味します。 我々はRGBを言うとき、これは、典型的には反対のようなものです。これは、実際のBGRが起こっている。 我々は実際にビットマップ画像の一例に見ればそう - 私はここに1をプルアップしてみましょう。 それは少し小さいです。 私は、ズームしている、と我々はそれがピクセル化されたのがわかります。それは色のブロックのように見えます。 その後、白いブロックと赤ブロックがあります。 あなたはMicrosoftペイントで再生した場合、例えば、あなたは、そのような何かを作ることができる 基本的には、特定の順序で特定の正方形を描くことによって。 だから、これはビットマップに変換するものを、次のとおりです。 、ここでは、すべての6のfであることを、最初に白のピクセルを持って、私たちは赤のピクセルを持っている 0000FFで示される。 それで、我々が持っているバイトのシーケンスは、ビットマップ画像を見に行くされている方法を示しています。 それでは、私はここに行ったのはちょうどすべてのそれらのバイトを書き出され、赤で着色された後、 あなたは親切なの見ることができるように、その種類は、スマイリーフェイスを示し、どのように目を細めて少し、もし。 ビットマップイメージの仕事が私であることの方法は、グリッドとして、基本的にそれを思い描きます。 それでデフォルトでは、グリッドのすべての行は、4バイトの倍数でなければなりません。 我々はビットマップ画像を見れば、あなたは、すべての値を埋めている。 例えば、あなたが、ここ、ここ、ここに青、緑、赤があるかもしれません しかし、あなたはイメージが4バイトの倍数で埋められていることを確認する必要があります。 私は私のイメージは3ブロックワイドになりたいもしそうなら、私は空の値を入れなければならないでしょう それは4の倍数にするための最後の1インチ それでは、私たちはパディングを呼んでいる何かに追加することになります。 私はそこに、xで示すつもりです。 今、私たちは、例えば、7ピクセルの長さで画像が欲しいと言う。 私たちは、1、2、3、4、5、6、7を持っている そしてそのすべてが色で塗りつぶされます。 ビットマップイメージが動作している方法は、我々は第八が必要だということです。 今、私たちは1、2、3、4、5、6、7を持っています。 我々は正しく読み取るためにビットマップイメージの8つのスペースを必要としています。 それでは我々は何をすべきかパディングのほんの少しで追加され すべての文字幅が均一であることを確認し とすべての文字幅が4の倍数であること。 そして、私は以前に、xまたは波線としてパディング示さ しかし、実際のビットマップ画像にパディングは、16進数0で示されます。 だからそれは、単一の文字、0になります。 何が便利になるかもしれないとXXDコマンドです。 それは何を行うのは実際に私がスマイリーと前に何をしたかのようになっている、あなたを示している 私は実際にそれぞれの色が画素ごとにどのようになるか、プリントアウトするとき その後、あなたは、次のコマンドを使用してXXD実行すると、それを色分けされ それは実際の色はそれらのピクセルのために何であるかが出力されます。 あなたは何をしなければならないと私は、-s 54のように、ここに示すの上にある 私は第五十四バイトから開始するつもりだと言っている 、その前に、我々はビットマップの地図に戻って見れば覚えているので、 すべてのヘッダー情報とそのようなことは、そのだ。 しかし、私たちが本当に気にして色を示す実際のピクセルです。 だから、-S 54そのフラグを追加することによって、我々は、色の値を参照することができるしている。 そして、そのような複雑なフラグや物事を心配しないでください。 問題セットの仕様では、ピクセルを表示するXXD使用方法についての指示があるでしょう。 ここで見たのであれば、それは一種の緑色のボックスに、この小さなことのように見えます。 私は基本的には青、緑が多く、赤なしを言っていないよう00FF00を色分けされてきました。 だからグリーンに対応しています。 ここで見たように、我々は緑色の四角形を参照してください。 この緑色の四角形は、私たちがしなければならないどのようなので、その後、わずか3ピクセル幅 画像は4幅の倍数であることを確認するために、余分なパディングに追加するだけです。 それで、あなたはここで、これらの0をどのように見ているかだ。 これは実際に、あなたのリサイズpsetの結果になるでしょう 基本的に小さなビットマップを服用した後、4でそれを拡大する。 それで、私たちが見るものは、実際にはこの画像は12ピクセルの幅であるということですが、12は4の倍数である 我々が何かを追加する必要はありませんので、それで我々は実際に末尾に0が表示されない それは完全に埋められているからだ。これは、任意のより多くの部屋を持っていません。 オーケー。パディングについてのご質問? オーケー。クール。 私は前に述べたように、ビットマップは単にバイトシーケンスです。 それで、私たちが持っていると、バイトの数を正確に追跡する必要があるのではなく、ある 特定の要素に対応し、我々は実際にそれを表現する構造体を作成しました。 だから、我々が持っているものRGBTRIPLE structです。 あなたは、RGBトリプルのインスタンスを持っているときはいつでも、 これは型定義構造体であるため、その後、rgbtBlue変数にアクセスすることができ、 と表示され、同様に緑と赤の変数は、どのくらいの青、緑、赤、 それぞれ、あなたは持っている。 だから我々は0〜青に設定された変数、ffの緑のセットを持っていたら、 、それはあなたが持つことができる最大値であり、続いて赤の変数が0に設定さ 次に何色がこの特定のRGBトリプル表すでしょう? >> [生徒]グリーン。 グリーン。その通りです。 それはあなたがRGBトリプルのインスタンスがあるときに知っておくと便利になるだろう、 青、緑、赤 - - 別々に、実際には色の量をアクセスすることができます。 今、私たちは、その構造について説明しましたので、次にBMPファイルを見てみましょう。 これらはあなたのために作られた構造体です。 ここでは、BITMAPFILEHEADER構造体を持っています。 関心の大きさです。 その後、我々は我々にとって興味深いものですいくつかのより多くのものを持っている情報のヘッダーを、持っている すなわちサイズ、幅、高さ。 後ほどに行こうとして、ファイルにして読むとき、 それは自動的に私達が同じになるように順番を設定しているので、システムに読み込まれます。 だからbiSizeは画像の実際のサイズに対応する右のバイトが含まれます。 そして、ここで、最後に、我々が話してきたように、我々はRGBTRIPLEます。typedef structを持っています。 我々は、それに関連付けられているrgbtBlue、緑、および赤を持っています。 グレート。オーケー。 今、私たちは、ビットマップを少し理解することが、我々はファイルヘッダを持っていることを理解する とそれに関連付けられている情報のヘッダーと、その後、我々は面白いものを持っている 色で、それらの色は、RGBTRIPLE構造体で表現され そしてそれらは、順番に、緑、青、赤に関連する3つの値を持っています。 だから今、私たちは約ビットを回復すると思う一種のことができます。 申し訳ありません。推理小説について考えてみよう。 私達が私達の手掛かりファイルを持っているとき、我々が何をしたいピクセルによってそれピクセルに読み取られる 我々が読める形式にして出力できるようにしてから、何とかしてそれらのピクセルを変更してください。 そしてそれを出力するために、我々はverdict.bmpファイルに画素毎に記述するつもりです。 それはやるべきことがたくさんのようなものだ。我々はそれを実現しています。 だから我々は何をやったかを私たちは実際にcopy.c.をご提供してきましたさ それなのに何が行うことはただ与えられたビットマップファイルの正確なコピーを作成し、それを出力しています。 だから、これはすでに、あなたのためにファイルをオープンし、画素毎に読み込み その後出力ファイルにそれを書き込みます。 のは、その見てみましょう。 これは、適切な使用を確保することです ここでファイル名を取得する。 これは何を行うのは、それは我々がここでinfileに合格したものでは、入力ファイルを設定している それは私たちの2番目のコマンドライン引数です。 我々は、ファイルを開くことができるかどうかをチェックします。 我々がここの新しいファイルを作ることができるかどうかをチェックします。 その後、これはここに何をするかは、それだけで基本的に最初からビットマップファイルで読み始めます。 初めは、私たちが知っているように、BITMAPFILEHEADERが含まれています などのビットのこれらの配列は、直接BITMAPFILEHEADERに入力されます。 だから我々はここに持っているものをそのBITMAPFILEHEADER bfと言っている - ことは、タイプBITMAPFILEHEADERの私達の新しい変数だ - 我々は我々のINFILEであるポインタでから読んだものBFの中に配置しようとしている。 我々はどのくらい読みますか? 我々は全体BITMAPFILEHEADERが含まれている必要がどのように多くのバイトを読み込みます。 同様に、それは我々が情報ヘッダーのための仕事だ。 だから我々は、我々のファイルinfileに沿って継続している そして我々はそれらのビットとバイトを読んでいて、私たちは、直接それらを差し込むしている 私たちが作っている変数のこれらのインスタンスに変換します。 ここでは、単にビットマップはビットマップであることを確認して作っている。 今、私たちは右、outfileを持っている? それは我々がそれを作成したときに立っているように、それは本質的に空です。 だから我々は基本的にゼロから新しいビットマップを作成する必要があります。 我々がやっていることは、我々はファイルのヘッダにコピーすることを確認する必要がある そしてちょうどINFILEのような情報ヘッダがあります。 とbfは変数であることを覚えている - 私たちがやっていることは我々が書いてある タイプBITMAPFILEHEADERのため、我々は何をすべきか、私たちはちょうどそのコンテンツを使用することです INTO OUTFILEを書き込むことができます。 ここでは、パディングの話を覚えて、 それは我々が持っているピクセルの量が4の倍数であることを確認することが重要だ方法。 これはあなたが持っているどのくらいのパディング計算するのは非常に有用な式である あなたのファイルの幅を与えられた。 私は君たちがそれなのに、私たちがパディングを計算するための式を持っていることを覚えておきたい。 大丈夫ですか?だから誰もがあることを覚えています。グレート。 それではそれなのに、次回何をするか、それが走査線のすべてを繰り返し処理しています。 それは、最初の行を通過し、その後、読み取ったすべてのトリプルを格納 その後OUTFILEに書き込みます。 それでは、ここで我々は一度に1つのRGBトリプルを読んでいる その後INTO OUTFILEを同じトリプルを置く。 トリッキーな部分は、パディングはRGBトリプルではないということです それで我々は単にRGBの3つ組がそのパディング量を読み取ることができません。 私たちがしなければならないことはただ、私たちのカーソルを移動させ、私たちのファイル位置指示子を動かす実際 我々は次の行にいるように、すべてのパディングを飛ばしの種類に。 そして、これが何のコピーを使用すると、パディングを追加するかもしれないかを示しています。 だから我々は、我々が必要とするどのくらい水増し計算した そう、それは我々が0のパディング数が必要であることを意味します。 これは何には、弊社のINTO OUTFILEを0パディングの番号を入れますforループです。 そして最後には、両方のファイルを閉じます。あなたは、INFILEと同様に出力ファイルを閉じます。 だからそれはどのようなそれなのに作品は、 そしてそれはかなり便利になるだろう。 だけではなく、実際にそれを直接コピーして貼り付けるの またはちょうどそれを見て、あなたが好きに入力し、 あなただけの、端末で次のコマンドを実行する必要があるかもしれませ 新しいファイルを作成しますCPそれなのにwhodunit.c、whodunit.c、 それはコピーがないとまったく同じ内容を含んでいます。 それでは我々は何ができるかのフレームワークとしてその上に構築したり編集したりすることに使用されている 私たちの推理ファイルに対して行われます。 これらは私達へ-DOSは、推理小説のためにしていますが、それなのには何をするか 実際に私たちのために、それらのほとんどの世話をされています。 だから我々は次に何をする必要があるすべては、必要に応じてピクセルを変更です 実際にファイルを読めるようにします。 タイプRGBTRIPLEの与えられた変数のためにそう、トリプル与えられた画素のためにそのことを覚えていて、 あなたは、青、緑、赤の値にアクセスできます。 あなたがそれらにアクセスできる場合があるから重宝するだろう、 それはあなたにも、それらを確認できることを意味します それはあなたも、それらを変更できることを意味します。 だから我々は赤い虫眼鏡の例に戻って行ったとき、 基本的に、それは私たちのためにフィルタの一種として行動していた。 だから我々が何をしたいのか我々はインチ来ているトリプルのすべてをフィルタしたいです これを行うには、いくつかの異なる方法があります。 基本的に、あなたはあなたが欲しいどんなタイプのフィルタができます。 たぶん、あなたはすべて赤のピクセルを変更したい または多分あなたは別の色に別の色のピクセルを変更したい。 それはあなた次第です。 あなたはピクセルが何色であることをチェックできることを覚えておいてください あなたが通過しているとして、あなたはまた、それを変更することができます。 オーケー。だからそれは推理小説だ。 一度推理小説を実行すると、犯罪の犯人が誰であったか知っているよ。 今、私たちは、リサイズに行くつもりです。 我々はまだビットマップを扱うことになるだろう。 我々がしようとしているのは、我々は入力ビットマップを持っているつもりです それから私達は数を渡し、その後outfileのビットマップを取得するつもりだ それは、基本的には、nでスケーリング当社INFILEだ場所。 私のファイルのサイズが大きいだけで1画素であったと言う。 私のnが3で3、スケーリングあった場合、ここで、私は、時代のその画素数nを繰り返すでしょう そう3回、その後も同様に3回、それをスケールダウン。 だからあなたは、私が水平垂直だけでなく、それをスケーリングしている参照してください。 そして、ここに例があります。 あなたは、n = 2を使用している場合は、まず、青の画素が2回が繰り返していることがわかり 水平方向だけでなく縦方向に2倍として。 その後に続いていること、そしてそのためには、2つのことで、元の画像の直接スケーリングを持っています。 我々はこのための詳細な擬似コードをした場合それでは、我々は、ファイルを開きたい。 そして、我々はここに戻って行くことを知っている場合 我々は、出力ファイルごとに幅がINFILEの幅は異なるものとしていることがわかります。 どういう意味ですか? それが私たちのヘッダー情報が変更しようとしていることを意味します。 それで、我々がやりたいだろうと、ヘッダ情報を更新している それなのにあなたはフレームワーク上で動作している場合、我々はファイルを読み込むときにことを知って、 我々はすでにサイズが何であるかを示し、そのようなものの変数を持っています。 だから、一度あなたが何をしたいかもしれないものは、それらの特定の変数を変更していることがあります。 あなたは構造体を持っている場合は、その内の変数にアクセスする方法を、覚えておいてください。 あなたは正しい、ドット演算子を使用できますか? さて、あなたはヘッダ情報を変更する必要がありますことを知っている使用して。 そこでここでは、ファイルに変更しようとしている実際の要素のリストだけだ。 ファイルサイズは、画像だけでなく、幅や高さを変更されようとしている。 それでは、ビットマップの地図に戻って それは、その情報を含むファイルヘッダーやinfoヘッダのかどうかを見てみ その後、必要に応じて変更します。 繰り返しになりますが、CPそれなのにresize.cを言う。 resize.c今コピーの中に記載されたすべてのものが含まれていることを意味します コピーは私たちに画素が各走査線の画素に読み取る方法を提供するからである。 現在、除くだけではなく、我々は推理小説でやったように値を変更する 私たちがやりたいことは、我々は、複数の画素に書きたいです 限り我々のnが1より大きいからである。 その後、我々が何をしたいのか、私たちはnで水平に伸ばしたいです 同様にnで垂直に伸ばす。 どのように我々はこれを行うのでしょうか? あなたのnが2であり、このinfileを与えていると言う。 カーソルは、最初のものから開始する予定です nが2である場合、何をやってみたいことは、あなたはそれらの2に印刷したい。 それで、あなたはそれらの2で印刷します。 次に、あなたのカーソルは赤1である次のピクセルに移動しようとしている、 そしてそれは前に行っているものの上にそれを付加して、その赤いものの2をプリントアウトするために起こっている。 その後、カーソルが次のピクセルに移動すると、それらの2に描画されます。 あなたはここにこれが何それなのに枠組みに戻ってみると それは、RGBトリプル、トリプルと呼ばれる新しい変数の新しいインスタンスを作成しています。 そして、それはその中に読み込みこことき、それはinfileを1 RGBTRIPLEから読み取る そのトリプル変数の中にそれを格納します。 それでは、実際には、その特定のピクセルを表す変数を持っています。 その後、あなたは何をしたいかもしれないもの、書くときforループにfwriteのステートメント包むです それは、必要に応じて何度でもあなたのOUTFILEに書き込みます。 それは十分に簡単です。 ただ、基本的に水平方向にスケーリングするために何回書き込みプロセス数nを繰り返します。 しかし、その後、私達は私達のパディングが変更しようとしていることを覚えておく必要があります。 以前、我々は長さが3のものを持っていたと言う。 その後、我々はどれだけのパディングに追加することになります?もう一つだけそれは4の倍数にする。 しかし、我々は、n = 2で、この特定の画像を拡大·縮小していると言う。 それでは、どのように多くの青色の画素我々は最後に持っているでしょうか?我々は6を持っているでしょう。 1、2、3、4、5、6。かしこまりました。 6は4の倍数ではありません。 4の倍数に最も近い値とは何ですか?それが8になるだろう。 だから我々は、実際にそこにパディングの2文字を持っているつもりです。 我々はパディングを計算する式を使用している場合は誰でも覚えていますか そしてそれはどこになるのでしょうか? [聞き取れない生徒の応答] >>うん、copy.c.右。 あなたが持っているどのくらいのパディング計算するそれなのに中の式があります ビットマップイメージの特定の幅を与えられた。 それでは、あなたはパディングの一定量で追加する必要がある場合に有用であることが起こっている 実際にあなたが追加する必要がありますどのくらいのパディング把握する。 しかし、一つのノートでは、しかし、あなたは右のサイズを使用していることを確認したいということです。 あなたは基本的に2つのビットマップ画像を扱うことになるだろうからといって注意してください。 あなたが右のいずれかを使用していることを確認したい。 あなたは出力ファイルに対してパディングを計算しているとき、あなたはoutfileの幅を使用したい 前のものではなく、幅。 グレート。その種類は、水平方向に全体のビットマップ画像を引き伸ばしの世話をする。 しかし、我々は何をしたいのか、実際に垂直だけでなく、それを伸ばしています。 これは、我々は、行のコピーが完了したときので、少しトリッキーになるだろう その行を書いて、私たちのカーソルは最後になるだろう。 我々は再び読み込むのであれば、それは単に次の行にで読み取るために起こっている。 だから我々が何をしたいのか、もう一度、それらの行をコピーしていくつかの方法を見つけるの一種である またはその行を取って、再びそれを書き換えるだけの種類。 私は種類のものに触れましたように、これを行うには、いくつかの異なる方法があります。 あなたが通過して、特定の走査線を介して読んでいるようにあなたは何ができることはある し、必要に応じてそれを変更し、店舗の種類、配列内のそれらのすべてのピクセル。 その後、あなたにあなたが再びその配列をプリントアウトする必要がありますことを知って、 ので、あなたはちょうどそれを行うには、その配列を使用することができます。 それを行うための別の方法は、あなたが1行下にコピーすることも可能です その再びコピーする必要があることを理解してますので、実際には、カーソルを移動する それはメソッドfseek関数を使用することになるだろう。 あなたはすべての帰りにカーソルを移動してから、再度コピー処理を繰り返すことができます。 私たちのスケーリング数がnである場合、そうだとすれば、何回我々は戻って行かなければならない とラインを書き換える? >> [学生]はn - 1。 >>うん、完璧。 N - 1。 我々は一度すでにそれをやったので、次に我々は後戻りプロセスを繰り返したいと思う N - 1回の量。 オーケー。だから、あなたはあなたのリサイズ機能を持っています。 今、私たちは本当に楽しい部分、回復は私のお気に入りのpset、取得することができます。 代わりにビットマップの、今回はJPEGファイルを扱っている。 我々は実際にはJPEGのファイルが与えられていないんです、 我々は基本的に生のメモリカードのフォーマットを与えている。 それで、これは、初めに情報やごみの値のビットが含まれています そして、それが開始され、それは、JPEGファイルの束を持っています。 しかし、我々は、我々は写真を削除したカードを手渡している。 写真はカード​​内に置かれている本質的に、私たちは忘れてしまいました。 それでは回復で私たちの使命は、このカードのフォーマットを通過することです そして再びそれらの写真を見つける。 幸いにも、JPEGファイルやカードファイルの構造は少し便利です。 それは、この特定の形式になっていないなら、それは間違いなく少しトリッキーだったかもしれない。 すべてのJPEGファイルは、実際には上記の2つの可能なシーケンスで始まります。 基本的には、新しいJPEGファイルを、あるたびに それはシーケンスFFD8 FFE0または他の1、FFD8 FFE1どちらから始まります。 知るためのもう一つの有用なことは、JPEGファイルが連続して格納されていることです。 だから1 JPEGファイルが終了するたびに、他の1が開始されます。 だからそこ値の間の任意の種類はありません。 あなたは既にJPEGを読んできた場合、一度は、JPEGの開始を打つ あなたが以前のものと次の始まりの終わりをヒットしたことを知っています。 これを視覚化の種類には、私は回路図を作りました。 JPEGファイルについてもう一つは、我々は一度に512バイトの配列にそれらを読むことができるということです 同様にカードの始まりである。 我々はそれが吸うなるので一つ一つのバイトをチェックする必要はありません。 だから代わりに、我々は何ができるかは、実際にはただ一度に512バイトが読み込まれる その後、代わりにそれらの小さなスライスのものの間にチェックインの、 私達はちょうど512バイトの先頭を確認することができます。 本質的に、この写真では、何を参照して、カードの先頭にある あなたは、実際のJPEGファイル自体には本当に関連していない値を持っています。 しかし、私が持っているものをJPEGの二つの出発のいずれかのシーケンスを示す星である。 だから、スターを見るたびに、あなたは、JPEGファイルを持っていることを知っている。 そして、すべてのJPEGファイルは、512バイトの倍数であることを行っている しかし、同じ倍数である必要はありません。 あなたが他の星をヒットした場合、あなたが別のJPEGをヒットしたことを知っている方法は、ある バイトの別の開始シーケンス。 次にあなたがここに持っているもの、あなたが星に到達するまでの間は、赤のJPEGファイルが継続しているです これらは新しい色で示されます。 続行してから、他の星を打つ、あなたは別のJPEGを打つ あなたは最後まですべての方法を継続する。 あなたは、ここで最後の画像でピンクの一つだね。 あなたはファイルの文字の終わりに到達するまでの間は、末尾に移動します。 これは本当に便利になるだろう。 ここではいくつかの主なポイント: カードファイルは、JPEGで始まらない JPEGが開始されると、しかし、JPEGファイルのすべてがお互いに並んで格納されています。 回復のためのいくつかの擬似コード。 まず、我々は、我々のカードファイルを開くしようとしている そしてそれは私たちのファイルI / O関数を使用することになるだろう。 我々は、ファイルの終わりに達するまで、以下の処理を繰り返すつもりです。 我々は一度に512バイトを読むつもりです。 と私がここで言ったことは、我々はバッファに格納するつもりです 我々は彼らをどうするかを正確に知るまでそう基本的にはそれらの512バイトを保持しているためです。 その後、我々が何をしたいのか、私たちがスターかどうかをヒットしたかどうかをチェックしたいです。 我々が開始シーケンスのいずれかをヒットした場合、我々は、星をヒットした場合は、 その後、我々は新しいJPEGファイルをヒットしたことを知っています。 私たちがやりたいよ私たちは私たちのpset4ディレクトリに新しいファイルを作成するつもりだ そのファイルを作っていきたい。 しかし、また、私たちは既に前にJPEGを作った場合、 次に我々は、そのファイルを終了してpset4フォルダにそれをプッシュする 我々は、そのJPEGファイルを終了したことを指定しない場合ので、私たちは、そのファイルが格納されている必要があります場所 その後、我々は基本的に不確定な量を持っているでしょう。 JPEGは決して終わらないでしょう。 だから我々は、我々はJPEGファイルにで読み取りおよび書き込みしているときことを確認したい 我々は、具体的に次のものを開くためにそれを閉じたい。 我々はいくつかのことを確認したいと思う。 我々は我々のバッファを持つ、新しいJPEGの開始時にいるかどうかを確認したい そしてまた、我々は既に前にJPEGを発見した場合 それはわずかにあなたのプロセスが変更されるため。 それでは、あなたはすべての道を通って行くと、ファイルの最後にヒットした後、 次にあなたがしたいと思う何を現在開いているファイルをすべてクローズしたいと思うです。 それはおそらく、あなたが持っている最後のJPEGファイルになります 同様にカードファイルなど、あなたが扱ってきたこと。 私たちが取り組む必要があることを最後の障害は、実際にJPEGファイルを作成する方法です そして実際にフォルダにそれをプッシュする方法について説明します。 psetには、あなたが見つけたすべてのJPEGは、次の形式であることが必要 どこで番号を持っていますJPG。 数は、それが0であっても、我々はそれが000.jpg呼ぶ。 あなたのプログラムでJPEGを見つけたときには、 あなたは、それが見つかった順番に名前を付けたいとしている。 これはどういう意味ですか? 我々は、我々が見つけたどのように多くのトラックを一種のを維持する必要がある と各JPEGの数はどうあるべきか。 ここでは、sprintf関数を利用するつもりです。 は、printfと同様に、どの端末にプリントだけの種類の値のうち、 sprintfのフォルダにファイルを出力します。 そして私はその後はsprintf、タイトル、およびそこに文字列を持っていた場合、これはどうなるのか、 それは2.JPGをプリントアウトするだろう。 正しく、私はファイルを閉じてしまったと仮定すると それは私が書いていたファイルを含んでいるでしょう。 しかし、1つの事は、私がここに持っていることをそのコードです かなりpsetには必要なものを満たしていません。 psetには、第二のJPEGファイルは002の代わりに、わずか2という名前を付ける必要があることが必要です。 だから、名前をプリントアウトしたときに、おそらくあなたは、わずかにプレースホルダを変更した方がいいでしょう。 誰もが私たちが何かを印刷するとき、我々は余分なスペースを可能にする方法を覚えていますか? うん。 >> [生徒]あなたは、パーセント記号と2の間に3を入れた。 >>うん、完璧。 我々は3のためのスペースが欲しいので、この場合は3を置くことにしましょう​​。 %3dは、おそらくあなたが002.JPGの代わりに2与えるだろう。 sprintf関数への最初の引数は、実際にはchar型の配列です その我々が以前に文字列として知っていた。 それらの意志、一時的な記憶のようなより多くのの種類は、単に結果の文字列を格納します。 あなたは本当にこれに対処することはありませんが、あなたはそれをインクルードする必要があります。 すべてのファイル名が3文字を占有数を持っていることを知って、 その後のjpg、この配列はどのくらいであるべきか? 番号を投げ出す。名前のタイトルで何文字? だからJPG 3ハッシュタグは、その期間は、あります。 >> [生徒] 7。 >> 7。はなく、かなり。 我々は、我々が同様にnull終端できるようにしたいので、8をするつもりだ。 最後に、ちょうどあなたが回復のためにやっているだろうというプロセスを引き出すために、 あなたには、いくつかの開始情報を持っています。 JPEGファイルの先頭を見つけるまでは、引き続き そしてそれは2から始まる配列のどちらかにすることができます。 あなたが読み続ける。ここにすべてのスラッシュが512バイトを表します。 あなたは別の起動シーケンスに遭遇するまで読み続け、読み続ける。 この場合には、それは赤一つだ - それがわかれば、あなたは現在のJPEGを終了することがある ので、あなたはそれを終了させたい。 あなたは、あなたのpset4フォルダにそのsprintfの名前にしたい その後、新しいJPEGを開いてから読み続けたい あなたは次が見つかるまで。 、読書を続ける、読書を続ける そして最後に、最終的に、あなたは、ファイルの最後に到達しようとしている ので、あなたは、あなたが使用していた最後のJPEG画像を閉じたいと思う sprintfはあなたのpset4フォルダに、次にあなたが得ていることは、すべての画像を見てみること。 それらの写真は、実際にはCS50スタッフの写真です、 psetのボーナス楽しみの一部が入ってくる場所なので、このは 写真でTFSを見つけるために、あなたのセクションで競合しているということです そしてあなたはpsetをやったことを証明するために彼らと写真を撮る ので、あなたは、職員が写真であるかを確認することができます。 だから、あなたはスタッフと一緒に写真を撮る。時には、あなたは彼らを追いかける必要があるでしょう。 おそらくそれらのいくつかは、あなたから離れて実行しようとします。 あなたも一緒に写真を撮る。 これは進行中である。 psetのが原因である場合、それが原因ではありません。 締め切りはspecに発表されます。 その後、一緒にあなたのセクションと、いずれかのセクションでは、最も写真を撮る ほとんどのスタッフと非常に素晴らしい賞品を獲得します。 取得するためのインセンティブのようなものだあなたのpset4はできるだけ早く終了 その後、仕事に取り掛かることができるので、 すべての異なるCS50職員を追い詰める。 必須ではないですね、しかし、ので、一度は、写真を撮る 次にあなたはpset4で終了しました。 と私はチュートリアル4で終了しているので、来てくれて、すべてに感謝します。 フォレンジックで頑張って。 [拍手] [CS50.TV]