[MUSIC SPIEL] ZAMYLA CHAN: Es war Fräulein Scarlett mit dem Leuchter. Krimi? Nun, wir werden es herausfinden. In dem Brettspiel Clue, könnten Sie eine physische rote Bild gegeben werden. Und das Bild ist sehr rot und fleckig, und Ihre Aufgabe ist es, zeigen die versteckte Botschaft. Und in der Regel sind Sie mit einem roten bereitgestellt Lupe, oder ein roter Bildschirm zu zeigen, dass versteckte Botschaft. Nun, wir gehen zu imitieren. In Krimi, sind Sie ein Bitmap-Bild gegeben das sieht sehr fleckig und rot, und dann das Krimi-Programm um eine versteckte Botschaft zu offenbaren. Also lassen Sie brechen diese in Schritte. Erstens, um die Datei zu öffnen will dich - der Hinweis, dass Sie gegeben haben. Und dann auch eine Urteil Bitmap-Datei. Dann können Sie die Bitmap aktualisieren möchten Header-Informationen für das Urteil Ausgabedatei. Mehr dazu später. Und dann wirst du in den Lese Hinweis, Scanline, Pixel für Pixel, Ändern der Pixelfarben als notwendig und Schreib denen, die in dem Urteil - Pixel für Pixel in der Urteil Scanline. Wie beginnen wir gehen über diese? Nun, zum Glück haben wir copy.c in der Verteilung Code. Und das wird zu beweisen, sehr nützlich für uns. Copy.c öffnet eine Datei, liest, dass infile Kopfball und aktualisiert dann die outfile Kopfball. Und dann liest sie jedes Pixel in der Abtastlinie pixelweise, und dann schreibt, dass die Pixel in der Ausgabedatei. Also, der erste Schritt könnte sein, die folgenden laufen Befehl im Terminal - cp copy.c whodunit.c. Dadurch wird eine Kopie der zu erstellen copy.c whodunit.c benannt. So ist unser erster Schritt zum Öffnen der Datei, gut, es gibt eine exakte Replik, dass in copy.c. Also werde ich Sie zu verlassen, um sich darum kümmern. Was wir zu tun in diesem Pset Datei-I / O, im Grunde unter Dateien, Lesen, Schreiben, sie zu bearbeiten. Wie kann man eine Datei öffnen zuerst? Nun, Sie gehen, um eine Datei zu erklären sind Zeiger, und dann rufen die Funktion fopen. Der Pass in den Weg, oder den Namen, dass Datei und dann die gewünschten Modus , um die Datei zu öffnen in. Passing in einem r wird geöffnet foo.bmp zum Lesen. Während fopen mit Übergabe einer w wird offene bar.bmp, für das Schreiben des Datei-und tatsächlich bearbeiten. So, jetzt haben wir die Datei geöffnet wird, unsere nächste Schritt ist es, die Kopfinformationen aktualisieren für die Ausgabedatei. Was ist ein Header-Informationen? Nun, zuerst müssen wir wissen, was für ein Bitmap. Eine Bitmap ist nur eine einfache Anordnung der Bytes. Und sie sind in dieser Datei deklariert hier bmp.h, mit einem Bündel von Informationen, was ein Bitmap ist eigentlich aus gemacht sind. Aber was wir wirklich über die Bitmap-Datei-Header, genau hier, und die Bitmap-Header Informationen, hier. Der Header wird von einem Paar von zusammen Variablen, die sehr nützlich erweisen wird. Es gibt BiSizeImage, das der ist Gesamtgröße des Bildes in Bytes. Und dazu gehört Pixel und Polsterung. Polsterung ist sehr wichtig, aber dazu kommen wir später. BiWidth die Breite der Bild in Pixeln abzüglich der Polsterung. BiHeight ist dann auch die Höhe des Bildes in Pixel. Und dann die BITMAP und die BITMAP, wie ich bereits erwähnt zuvor, die vertreten sind, als Strukturen. Also, Sie haben nicht den Datei-Header zugreifen können selbst, aber Sie wollen zu bekommen diese Variablen im Inneren. OK. So, wie wir die Header-Informationen zu aktualisieren? Nun, zuerst müssen wir sehen, ob wir brauchen, um alle Informationen aus ändern die Eingabedatei, der Anhaltspunkt, um die outfile, das Urteil. Ist etwas zu ändern in diesem Fall? Na ja, nicht wirklich, denn wir gehen um nur die Änderung werden die Farben. Wir gehen nicht auf die Datei geändert werden Größe, die Bildgröße, die Breite, oder die Höhe. Also alles in Ordnung für jetzt durch sind nur das Kopieren jedes Pixel. OK. So, jetzt anschauen, wie wir tatsächlich lassen kann jedes Pixel aus der Datei zu lesen. Eine weitere Datei-I / O-Funktion ins Spiel kommen - fread. Es nimmt einen Zeiger auf die Struktur das wird die Bytes enthalten, die Sie lesen. So können Sie in das lesen. Und dann in einer Größe bestehen, die, die Größe jedes Element, das Sie lesen wollen. Hier wird die Funktion sizeof wird sich als nützlich. Dann passieren Sie an der Zahl, die die Anzahl von Elementen Größe zu lesen. Und dann endlich, InPtr, was der Dateizeiger, der du bist gehen, um von zu lesen. Also alle diese Elemente im Inneren sind InPtr und sie sind, um Daten geht. Lassen Sie uns an einem kleinen Beispiel. Wenn ich in die Daten zwei Hunde zu lesen, gut, ich kann es tun eine von zwei Möglichkeiten. Ich kann entweder in zwei Objekten der Größe lesen Hund von meinem InPtr, oder ich kann lesen in einem Objekt die Größe von zwei Hunden. Sie sehen also, dass je nach der Art und Weise Sie arrangieren, dass Größe und Anzahl, die Sie können in der gleichen Anzahl von Bytes zu lesen. So, jetzt ändern wir die Pixelfarbe als wir brauchen. Wenn man sich bmp.h wieder schauen, dann Sie werden feststellen, dass an der Unterseite zu sehen RGBTRIPLEs sind eine andere Struktur, wo sie bestehen aus drei Bytes besteht. Eins, rgbtBlue, rgbtGreen und rgbtRed. Also jeder von ihnen stellt die Menge von Blau, die Menge von Grün, und die Menge der roten in diesem pixel, wo Jede Menge wird durch a Hexadezimalzahl. So ff0000 wird eine blaue Farbe, denn es geht von blau, zu grün, zu rot. Und dann f wird es sein, weiß. Werfen wir einen Blick auf smiley.bmp, die Sie haben in Ihrer Distribution Code. Wenn Sie es in nur einem Bild zu öffnen Betrachter, dann werden Sie nur sehen, einen roten Smiley. Aber wenn man einen tieferen Tauchgang, wir werden sehen, dass die Struktur davon ist nur Pixel. Wir haben weiße Pixel, und dann rote Pixel. Die weiße, ffffff, und dann alle von der roten Pixel, die ich in für Sie gefärbt hier, und Sie sehen, dass sie 0000ff. Zero-blau, Null grün, rot und voller. Und da Smiley ist acht Pixel breit, wir haben keine Polsterung. Gut. Also, wenn ich auf andere Werte zuweisen waren zu einer RGBTRIPLE und ich wollte machen es grün, dann, was ich tun würde, ist Ich würde eine RGBTRIPLE namens erklären Dreibett-, und dann zu jeder zugreifen Byte innerhalb dieser Struktur I würde den Punktoperator. So triple.rgbtBlue, kann ich zuweisen, dass auf 0 zurück. Grün kann ich es voll zuordnen - jede Nummer, wirklich, zwischen 0 und ff. Und dann rot, werde ich auch gehen, um 0 zu sagen. Also das gibt mir einen grünen Pixel. Weiter, was ist, wenn ich will, um zu überprüfen der Wert von etwas? Ich konnte etwas, das überprüft haben , ob der dreifache Wert des rgbtBlue ff und dann drucken, "Ich fühle mich Blau! ", als Ergebnis. Nun bedeutet das nicht unbedingt, dass die Pixel ist blau, oder? Weil grüne und rote Werte des Pixels könnte auch Nicht-0-Werte. Alles, was das bedeutet, und alles, dies wird für die Überprüfung ist für eine volle blaue Farbe. Aber alle Pixel könnten auch Teil Farbwerte, wie diese nächste Beispiel. Es ist ein wenig schwieriger zu sehen was das Bild ist jetzt. Das sieht ein bisschen mehr wie die clue.bmp, dass Sie gegeben werden. Jetzt, physisch, könnte dies zu lösen, denn es gibt eine Menge von roten, von hält ein roter Bildschirm, um das Bild so dass die anderen Farben können angezeigt werden. So, wie wir dies mit c imitieren? Nun, wir könnten alle rot entfernen aus dem Bild. Und so zu tun, dass wir würden jeden Satz Pixel Rot-Wert auf 0 setzen. Und so würde das Bild ein wenig suchen etwas wie diesen, wo wir keine roten haben auch immer. Wir können das eine versteckte Nachricht zu sehen bisschen mehr klar jetzt. Es ist eine andere Smiley-Gesicht. Oder vielleicht werden wir eine andere Methode verwenden. Vielleicht, wir identifizieren konnten alle roten Pixel - das heißt, alle Pixel mit 0 blau, grün 0, 0 und rot - und ändern Sie die zu weiß. Und unser Bild aussehen könnte so etwas. Ein wenig leichter zu sehen. Es gibt viele andere Möglichkeiten, um aufzudecken die geheime Nachricht als gut, Umgang mit der Farbmanipulation. Vielleicht könnte einer der Methoden dass ich oben erwähnt. Und zusätzlich, möchten Sie vielleicht einige Farben verbessern und bringen diejenigen heraus. So, jetzt haben wir die Pixel geändert Farbe, nächstes müssen wir nur noch zu schreiben in die Abtastlinie pixel. Und wieder werden Sie wollen zurück zu copy.c, wenn Sie nicht kopiert haben es bereits, und Blick auf die fwrite Funktion, die Daten erfolgt, wird ein Zeiger auf die Struktur, die die Bytes enthält, dass Sie von, der Größe der gerade lesen die Elemente, die Anzahl der Elemente, und dann die outptr - das Ziel dieser Dateien. Nachdem Sie in den Pixeln zu schreiben, werden Sie müssen auch in der Polsterung zu schreiben. Was ist Polsterung? Nun, jeder RGBT Pixel drei Bytes lang. Aber die Scanline für ein Bitmap-Bild muß ein Vielfaches von vier Byte. Und wenn die Anzahl der Pixel ist kein Faches von vier ist, dann müssen wir hinzufügen Diese Polsterung. Padding wird nur von 0s vertreten. Also, wie wir schreiben, oder lesen Sie das? Nun stellt sich heraus, dass man nicht tatsächlich fread Polsterung, aber Sie können berechnen sie. In diesem Fall ist der Schlüssel und das Urteil die gleiche Breite haben, so dass die Polsterung ist die gleiche. Und die Polsterung, wie Sie sehen werden in copy.c, berechnet mit der folgenden Formel - bi.biWidth mal sizeof (RGBTRIPLE) wird geben uns, wie viele Bytes der bmp hat in jeder Zeile. Von dort werden die modulos und Subtraktionen mit 4 berechnen, wie viele Bytes hinzugefügt werden muss, so dass das Vielfache von Bytes auf jede Zeile ist vier. Jetzt, da wir die Formel für haben wie viel Polsterung wir brauchen, jetzt wir können es schreiben. Jetzt habe ich erwähnt, vor, Polsterung ist nur 0s. Also in diesem Fall, sind wir gerade dabei, ein Zeichen, in diesem Falle eine 0 ist, in unsere outptr - unsere outfile. Damit kann einfach sein fputc 0, Komma outptr. Also, während wir in das Lesen wurde unsere Datei, Datei-I / O hat der Spur hielten unsere Position in diesen Dateien mit etwas rief die Datei Stellungsanzeige. Betrachten Sie es als Cursor. Im Grunde geht es jedes Mal fread, dass wir, aber wir haben Kontrolle über sie auch. Um die Datei Stellungsanzeige zu bewegen, Sie können die Funktion fseek verwenden. Wo der InPtr stellt den Datei Zeiger, die Sie suchen in sind, die Menge ist die Anzahl der Bytes, die man wollen, um den Cursor zu bewegen aus und dann bezieht sich auf den Bezugspunkt von wo aus sich der Cursor. Wenn Sie in SEEK_CUR passieren, dass stellt die aktuelle Position in der Datei. Oder Sie können einige andere Parameter verwenden. Also, wir verwenden möchten, könnten fseek überspringen über die Polsterung der in der Datei. Und wieder, wenn Sie stecken, gibt es ein Beispiel dafür in copy.c. So, jetzt haben wir die Datei geöffnet wird, der Schlüssel, und das Urteil. Wir haben den Header-Info für aktualisiert unser Urteil, denn jeder Bitmap braucht eine Kopfzeile. Wir haben dann in die Spur zu lesen Abtastlinie pixelweise wechselnden jede Farbe nach Bedarf, und Schreiben solcher, die in der Urteil, Pixel für Pixel. Sobald Sie Urteil öffnen, sehen Sie, wer der Täter, oder was das Geheimnis Nachricht ist. Mein Name ist Zamyla und dies war Krimi.