1 00:00:00,000 --> 00:00:09,500 >> [MUSIC SPIEL] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Es war Fräulein Scarlett mit dem Leuchter. 3 00:00:12,350 --> 00:00:13,560 Krimi? 4 00:00:13,560 --> 00:00:15,030 Nun, wir werden es herausfinden. 5 00:00:15,030 --> 00:00:20,870 In dem Brettspiel Clue, könnten Sie eine physische rote Bild gegeben werden. 6 00:00:20,870 --> 00:00:24,120 Und das Bild ist sehr rot und fleckig, und Ihre Aufgabe ist es, 7 00:00:24,120 --> 00:00:25,490 zeigen die versteckte Botschaft. 8 00:00:25,490 --> 00:00:29,740 Und in der Regel sind Sie mit einem roten bereitgestellt Lupe, oder ein roter Bildschirm zu 9 00:00:29,740 --> 00:00:31,410 zeigen, dass versteckte Botschaft. 10 00:00:31,410 --> 00:00:33,340 Nun, wir gehen zu imitieren. 11 00:00:33,340 --> 00:00:37,960 >> In Krimi, sind Sie ein Bitmap-Bild gegeben das sieht sehr fleckig und rot, 12 00:00:37,960 --> 00:00:43,430 und dann das Krimi-Programm um eine versteckte Botschaft zu offenbaren. 13 00:00:43,430 --> 00:00:45,650 >> Also lassen Sie brechen diese in Schritte. 14 00:00:45,650 --> 00:00:50,390 Erstens, um die Datei zu öffnen will dich - der Hinweis, dass Sie gegeben haben. 15 00:00:50,390 --> 00:00:53,880 Und dann auch eine Urteil Bitmap-Datei. 16 00:00:53,880 --> 00:00:58,240 Dann können Sie die Bitmap aktualisieren möchten Header-Informationen für das Urteil Ausgabedatei. 17 00:00:58,240 --> 00:00:59,920 Mehr dazu später. 18 00:00:59,920 --> 00:01:04,319 Und dann wirst du in den Lese Hinweis, Scanline, Pixel für Pixel, 19 00:01:04,319 --> 00:01:07,320 Ändern der Pixelfarben als notwendig und Schreib 20 00:01:07,320 --> 00:01:08,960 denen, die in dem Urteil - 21 00:01:08,960 --> 00:01:12,000 Pixel für Pixel in der Urteil Scanline. 22 00:01:12,000 --> 00:01:13,780 >> Wie beginnen wir gehen über diese? 23 00:01:13,780 --> 00:01:16,940 Nun, zum Glück haben wir copy.c in der Verteilung Code. 24 00:01:16,940 --> 00:01:21,240 Und das wird zu beweisen, sehr nützlich für uns. 25 00:01:21,240 --> 00:01:29,700 Copy.c öffnet eine Datei, liest, dass infile Kopfball und aktualisiert dann die 26 00:01:29,700 --> 00:01:31,070 outfile Kopfball. 27 00:01:31,070 --> 00:01:37,010 Und dann liest sie jedes Pixel in der Abtastlinie pixelweise, und dann 28 00:01:37,010 --> 00:01:42,390 schreibt, dass die Pixel in der Ausgabedatei. 29 00:01:42,390 --> 00:01:45,020 >> Also, der erste Schritt könnte sein, die folgenden laufen 30 00:01:45,020 --> 00:01:46,420 Befehl im Terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Dadurch wird eine Kopie der zu erstellen copy.c whodunit.c benannt. 33 00:01:55,320 --> 00:01:58,320 So ist unser erster Schritt zum Öffnen der Datei, gut, es gibt eine exakte 34 00:01:58,320 --> 00:02:00,070 Replik, dass in copy.c. 35 00:02:00,070 --> 00:02:03,360 Also werde ich Sie zu verlassen, um sich darum kümmern. 36 00:02:03,360 --> 00:02:07,860 >> Was wir zu tun in diesem Pset Datei-I / O, im Grunde unter Dateien, 37 00:02:07,860 --> 00:02:10,229 Lesen, Schreiben, sie zu bearbeiten. 38 00:02:10,229 --> 00:02:12,650 Wie kann man eine Datei öffnen zuerst? 39 00:02:12,650 --> 00:02:16,800 Nun, Sie gehen, um eine Datei zu erklären sind Zeiger, und dann rufen die 40 00:02:16,800 --> 00:02:18,670 Funktion fopen. 41 00:02:18,670 --> 00:02:23,150 Der Pass in den Weg, oder den Namen, dass Datei und dann die gewünschten Modus 42 00:02:23,150 --> 00:02:24,700 , um die Datei zu öffnen in. 43 00:02:24,700 --> 00:02:28,620 Passing in einem r wird geöffnet foo.bmp zum Lesen. 44 00:02:28,620 --> 00:02:35,670 Während fopen mit Übergabe einer w wird offene bar.bmp, für das Schreiben des Datei-und 45 00:02:35,670 --> 00:02:37,020 tatsächlich bearbeiten. 46 00:02:37,020 --> 00:02:41,970 >> So, jetzt haben wir die Datei geöffnet wird, unsere nächste Schritt ist es, die Kopfinformationen aktualisieren 47 00:02:41,970 --> 00:02:43,230 für die Ausgabedatei. 48 00:02:43,230 --> 00:02:44,610 Was ist ein Header-Informationen? 49 00:02:44,610 --> 00:02:48,160 Nun, zuerst müssen wir wissen, was für ein Bitmap. 50 00:02:48,160 --> 00:02:51,000 Eine Bitmap ist nur eine einfache Anordnung der Bytes. 51 00:02:51,000 --> 00:02:55,480 Und sie sind in dieser Datei deklariert hier bmp.h, mit einem Bündel von 52 00:02:55,480 --> 00:02:58,610 Informationen, was ein Bitmap ist eigentlich aus gemacht sind. 53 00:02:58,610 --> 00:03:05,730 Aber was wir wirklich über die Bitmap-Datei-Header, genau hier, und 54 00:03:05,730 --> 00:03:08,460 die Bitmap-Header Informationen, hier. 55 00:03:08,460 --> 00:03:13,170 Der Header wird von einem Paar von zusammen Variablen, die sehr nützlich erweisen wird. 56 00:03:13,170 --> 00:03:18,400 Es gibt BiSizeImage, das der ist Gesamtgröße des Bildes in Bytes. 57 00:03:18,400 --> 00:03:20,890 Und dazu gehört Pixel und Polsterung. 58 00:03:20,890 --> 00:03:24,210 Polsterung ist sehr wichtig, aber dazu kommen wir später. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth die Breite der Bild in Pixeln abzüglich der Polsterung. 60 00:03:30,000 --> 00:03:34,220 BiHeight ist dann auch die Höhe des Bildes in Pixel. 61 00:03:34,220 --> 00:03:38,240 Und dann die BITMAP und die BITMAP, wie ich bereits erwähnt 62 00:03:38,240 --> 00:03:40,900 zuvor, die vertreten sind, als Strukturen. 63 00:03:40,900 --> 00:03:45,410 Also, Sie haben nicht den Datei-Header zugreifen können selbst, aber Sie wollen zu bekommen 64 00:03:45,410 --> 00:03:47,370 diese Variablen im Inneren. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 So, wie wir die Header-Informationen zu aktualisieren? 67 00:03:50,600 --> 00:03:54,020 Nun, zuerst müssen wir sehen, ob wir brauchen, um alle Informationen aus ändern 68 00:03:54,020 --> 00:03:58,480 die Eingabedatei, der Anhaltspunkt, um die outfile, das Urteil. 69 00:03:58,480 --> 00:04:00,250 Ist etwas zu ändern in diesem Fall? 70 00:04:00,250 --> 00:04:04,320 Na ja, nicht wirklich, denn wir gehen um nur die Änderung werden die Farben. 71 00:04:04,320 --> 00:04:07,550 Wir gehen nicht auf die Datei geändert werden Größe, die Bildgröße, die Breite, 72 00:04:07,550 --> 00:04:08,310 oder die Höhe. 73 00:04:08,310 --> 00:04:14,010 Also alles in Ordnung für jetzt durch sind nur das Kopieren jedes Pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 So, jetzt anschauen, wie wir tatsächlich lassen kann jedes Pixel aus der Datei zu lesen. 76 00:04:20,720 --> 00:04:23,640 Eine weitere Datei-I / O-Funktion ins Spiel kommen - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Es nimmt einen Zeiger auf die Struktur das wird die Bytes enthalten, die 79 00:04:28,440 --> 00:04:30,110 Sie lesen. 80 00:04:30,110 --> 00:04:31,890 So können Sie in das lesen. 81 00:04:31,890 --> 00:04:36,090 Und dann in einer Größe bestehen, die, die Größe jedes Element, das Sie 82 00:04:36,090 --> 00:04:37,360 lesen wollen. 83 00:04:37,360 --> 00:04:40,640 Hier wird die Funktion sizeof wird sich als nützlich. 84 00:04:40,640 --> 00:04:45,570 Dann passieren Sie an der Zahl, die die Anzahl von Elementen 85 00:04:45,570 --> 00:04:47,480 Größe zu lesen. 86 00:04:47,480 --> 00:04:51,180 Und dann endlich, InPtr, was der Dateizeiger, der du bist 87 00:04:51,180 --> 00:04:52,530 gehen, um von zu lesen. 88 00:04:52,530 --> 00:04:58,650 Also alle diese Elemente im Inneren sind InPtr und sie sind, um Daten geht. 89 00:04:58,650 --> 00:05:01,660 >> Lassen Sie uns an einem kleinen Beispiel. 90 00:05:01,660 --> 00:05:07,590 Wenn ich in die Daten zwei Hunde zu lesen, gut, ich kann es tun eine von zwei Möglichkeiten. 91 00:05:07,590 --> 00:05:15,250 Ich kann entweder in zwei Objekten der Größe lesen Hund von meinem InPtr, oder ich kann lesen 92 00:05:15,250 --> 00:05:19,280 in einem Objekt die Größe von zwei Hunden. 93 00:05:19,280 --> 00:05:23,580 Sie sehen also, dass je nach der Art und Weise Sie arrangieren, dass Größe und Anzahl, die Sie 94 00:05:23,580 --> 00:05:25,840 können in der gleichen Anzahl von Bytes zu lesen. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> So, jetzt ändern wir die Pixelfarbe als wir brauchen. 97 00:05:33,020 --> 00:05:37,320 Wenn man sich bmp.h wieder schauen, dann Sie werden feststellen, dass an der Unterseite zu sehen 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs sind eine andere Struktur, wo sie bestehen aus drei Bytes besteht. 99 00:05:42,920 --> 00:05:49,220 Eins, rgbtBlue, rgbtGreen und rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Also jeder von ihnen stellt die Menge von Blau, die Menge von Grün, und die 101 00:05:52,480 --> 00:05:57,250 Menge der roten in diesem pixel, wo Jede Menge wird durch a 102 00:05:57,250 --> 00:05:58,670 Hexadezimalzahl. 103 00:05:58,670 --> 00:06:04,370 >> So ff0000 wird eine blaue Farbe, denn es geht von blau, 104 00:06:04,370 --> 00:06:05,850 zu grün, zu rot. 105 00:06:05,850 --> 00:06:09,300 Und dann f wird es sein, weiß. 106 00:06:09,300 --> 00:06:13,440 Werfen wir einen Blick auf smiley.bmp, die Sie haben in Ihrer Distribution Code. 107 00:06:13,440 --> 00:06:15,690 Wenn Sie es in nur einem Bild zu öffnen Betrachter, dann werden Sie 108 00:06:15,690 --> 00:06:17,080 nur sehen, einen roten Smiley. 109 00:06:17,080 --> 00:06:20,380 Aber wenn man einen tieferen Tauchgang, wir werden sehen, dass die Struktur 110 00:06:20,380 --> 00:06:22,340 davon ist nur Pixel. 111 00:06:22,340 --> 00:06:25,880 Wir haben weiße Pixel, und dann rote Pixel. 112 00:06:25,880 --> 00:06:31,000 Die weiße, ffffff, und dann alle von der roten Pixel, die ich in für Sie gefärbt 113 00:06:31,000 --> 00:06:35,440 hier, und Sie sehen, dass sie 0000ff. 114 00:06:35,440 --> 00:06:39,760 Zero-blau, Null grün, rot und voller. 115 00:06:39,760 --> 00:06:45,350 Und da Smiley ist acht Pixel breit, wir haben keine Polsterung. 116 00:06:45,350 --> 00:06:47,360 Gut. 117 00:06:47,360 --> 00:06:53,310 >> Also, wenn ich auf andere Werte zuweisen waren zu einer RGBTRIPLE und ich wollte 118 00:06:53,310 --> 00:06:58,350 machen es grün, dann, was ich tun würde, ist Ich würde eine RGBTRIPLE namens erklären 119 00:06:58,350 --> 00:07:02,660 Dreibett-, und dann zu jeder zugreifen Byte innerhalb dieser Struktur I 120 00:07:02,660 --> 00:07:04,030 würde den Punktoperator. 121 00:07:04,030 --> 00:07:08,430 So triple.rgbtBlue, kann ich zuweisen, dass auf 0 zurück. 122 00:07:08,430 --> 00:07:13,460 Grün kann ich es voll zuordnen - jede Nummer, wirklich, zwischen 0 und ff. 123 00:07:13,460 --> 00:07:15,470 Und dann rot, werde ich auch gehen, um 0 zu sagen. 124 00:07:15,470 --> 00:07:19,160 Also das gibt mir einen grünen Pixel. 125 00:07:19,160 --> 00:07:23,030 >> Weiter, was ist, wenn ich will, um zu überprüfen der Wert von etwas? 126 00:07:23,030 --> 00:07:27,250 Ich konnte etwas, das überprüft haben , ob der dreifache Wert des rgbtBlue 127 00:07:27,250 --> 00:07:31,080 ff und dann drucken, "Ich fühle mich Blau! ", als Ergebnis. 128 00:07:31,080 --> 00:07:35,640 Nun bedeutet das nicht unbedingt, dass die Pixel ist blau, oder? 129 00:07:35,640 --> 00:07:40,060 Weil grüne und rote Werte des Pixels könnte auch Nicht-0-Werte. 130 00:07:40,060 --> 00:07:43,470 Alles, was das bedeutet, und alles, dies wird für die Überprüfung ist 131 00:07:43,470 --> 00:07:45,610 für eine volle blaue Farbe. 132 00:07:45,610 --> 00:07:50,050 Aber alle Pixel könnten auch Teil Farbwerte, wie diese 133 00:07:50,050 --> 00:07:52,180 nächste Beispiel. 134 00:07:52,180 --> 00:07:55,400 >> Es ist ein wenig schwieriger zu sehen was das Bild ist jetzt. 135 00:07:55,400 --> 00:08:00,320 Das sieht ein bisschen mehr wie die clue.bmp, dass Sie gegeben werden. 136 00:08:00,320 --> 00:08:03,600 Jetzt, physisch, könnte dies zu lösen, denn es gibt eine Menge von roten, von 137 00:08:03,600 --> 00:08:07,040 hält ein roter Bildschirm, um das Bild so dass die anderen Farben können angezeigt werden. 138 00:08:07,040 --> 00:08:10,968 So, wie wir dies mit c imitieren? 139 00:08:10,968 --> 00:08:15,640 Nun, wir könnten alle rot entfernen aus dem Bild. 140 00:08:15,640 --> 00:08:21,870 Und so zu tun, dass wir würden jeden Satz Pixel Rot-Wert auf 0 setzen. 141 00:08:21,870 --> 00:08:25,020 Und so würde das Bild ein wenig suchen etwas wie diesen, wo wir keine roten haben 142 00:08:25,020 --> 00:08:26,300 auch immer. 143 00:08:26,300 --> 00:08:29,390 >> Wir können das eine versteckte Nachricht zu sehen bisschen mehr klar jetzt. 144 00:08:29,390 --> 00:08:31,730 Es ist eine andere Smiley-Gesicht. 145 00:08:31,730 --> 00:08:33,870 Oder vielleicht werden wir eine andere Methode verwenden. 146 00:08:33,870 --> 00:08:36,480 Vielleicht, wir identifizieren konnten alle roten Pixel - 147 00:08:36,480 --> 00:08:41,100 das heißt, alle Pixel mit 0 blau, grün 0, 0 und rot - 148 00:08:41,100 --> 00:08:43,169 und ändern Sie die zu weiß. 149 00:08:43,169 --> 00:08:45,470 Und unser Bild aussehen könnte so etwas. 150 00:08:45,470 --> 00:08:48,250 Ein wenig leichter zu sehen. 151 00:08:48,250 --> 00:08:51,170 >> Es gibt viele andere Möglichkeiten, um aufzudecken die geheime Nachricht als gut, 152 00:08:51,170 --> 00:08:53,730 Umgang mit der Farbmanipulation. 153 00:08:53,730 --> 00:08:57,050 Vielleicht könnte einer der Methoden dass ich oben erwähnt. 154 00:08:57,050 --> 00:08:59,600 Und zusätzlich, möchten Sie vielleicht einige Farben verbessern 155 00:08:59,600 --> 00:09:02,620 und bringen diejenigen heraus. 156 00:09:02,620 --> 00:09:06,190 >> So, jetzt haben wir die Pixel geändert Farbe, nächstes müssen wir nur noch zu schreiben 157 00:09:06,190 --> 00:09:08,500 in die Abtastlinie pixel. 158 00:09:08,500 --> 00:09:11,860 Und wieder werden Sie wollen zurück zu copy.c, wenn Sie nicht kopiert haben 159 00:09:11,860 --> 00:09:18,170 es bereits, und Blick auf die fwrite Funktion, die Daten erfolgt, wird ein Zeiger 160 00:09:18,170 --> 00:09:23,230 auf die Struktur, die die Bytes enthält, dass Sie von, der Größe der gerade lesen 161 00:09:23,230 --> 00:09:26,610 die Elemente, die Anzahl der Elemente, und dann die outptr - 162 00:09:26,610 --> 00:09:29,450 das Ziel dieser Dateien. 163 00:09:29,450 --> 00:09:34,010 >> Nachdem Sie in den Pixeln zu schreiben, werden Sie müssen auch in der Polsterung zu schreiben. 164 00:09:34,010 --> 00:09:34,970 Was ist Polsterung? 165 00:09:34,970 --> 00:09:38,670 Nun, jeder RGBT Pixel drei Bytes lang. 166 00:09:38,670 --> 00:09:43,670 Aber die Scanline für ein Bitmap-Bild muß ein Vielfaches von vier Byte. 167 00:09:43,670 --> 00:09:47,650 Und wenn die Anzahl der Pixel ist kein Faches von vier ist, dann müssen wir hinzufügen 168 00:09:47,650 --> 00:09:48,880 Diese Polsterung. 169 00:09:48,880 --> 00:09:51,420 Padding wird nur von 0s vertreten. 170 00:09:51,420 --> 00:09:54,380 Also, wie wir schreiben, oder lesen Sie das? 171 00:09:54,380 --> 00:09:59,280 Nun stellt sich heraus, dass man nicht tatsächlich fread Polsterung, aber Sie können 172 00:09:59,280 --> 00:10:00,970 berechnen sie. 173 00:10:00,970 --> 00:10:04,400 >> In diesem Fall ist der Schlüssel und das Urteil die gleiche Breite haben, so dass die 174 00:10:04,400 --> 00:10:05,910 Polsterung ist die gleiche. 175 00:10:05,910 --> 00:10:09,370 Und die Polsterung, wie Sie sehen werden in copy.c, berechnet 176 00:10:09,370 --> 00:10:11,790 mit der folgenden Formel - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth mal sizeof (RGBTRIPLE) wird geben uns, wie viele Bytes der bmp 178 00:10:16,690 --> 00:10:18,280 hat in jeder Zeile. 179 00:10:18,280 --> 00:10:21,890 Von dort werden die modulos und Subtraktionen mit 4 berechnen, wie 180 00:10:21,890 --> 00:10:25,610 viele Bytes hinzugefügt werden muss, so dass das Vielfache von Bytes auf 181 00:10:25,610 --> 00:10:27,250 jede Zeile ist vier. 182 00:10:27,250 --> 00:10:30,490 >> Jetzt, da wir die Formel für haben wie viel Polsterung wir brauchen, jetzt 183 00:10:30,490 --> 00:10:31,610 wir können es schreiben. 184 00:10:31,610 --> 00:10:34,080 Jetzt habe ich erwähnt, vor, Polsterung ist nur 0s. 185 00:10:34,080 --> 00:10:39,730 Also in diesem Fall, sind wir gerade dabei, ein Zeichen, in diesem Falle eine 0 ist, in unsere 186 00:10:39,730 --> 00:10:41,710 outptr - unsere outfile. 187 00:10:41,710 --> 00:10:47,530 Damit kann einfach sein fputc 0, Komma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Also, während wir in das Lesen wurde unsere Datei, Datei-I / O hat der Spur hielten unsere 189 00:10:52,400 --> 00:10:57,440 Position in diesen Dateien mit etwas rief die Datei Stellungsanzeige. 190 00:10:57,440 --> 00:10:59,350 Betrachten Sie es als Cursor. 191 00:10:59,350 --> 00:11:03,550 Im Grunde geht es jedes Mal fread, dass wir, aber wir haben 192 00:11:03,550 --> 00:11:05,671 Kontrolle über sie auch. 193 00:11:05,671 --> 00:11:11,030 >> Um die Datei Stellungsanzeige zu bewegen, Sie können die Funktion fseek verwenden. 194 00:11:11,030 --> 00:11:15,600 Wo der InPtr stellt den Datei Zeiger, die Sie suchen in sind, die 195 00:11:15,600 --> 00:11:20,370 Menge ist die Anzahl der Bytes, die man wollen, um den Cursor zu bewegen aus und dann 196 00:11:20,370 --> 00:11:23,470 bezieht sich auf den Bezugspunkt von wo aus sich der Cursor. 197 00:11:23,470 --> 00:11:26,770 Wenn Sie in SEEK_CUR passieren, dass stellt die aktuelle 198 00:11:26,770 --> 00:11:28,100 Position in der Datei. 199 00:11:28,100 --> 00:11:31,020 Oder Sie können einige andere Parameter verwenden. 200 00:11:31,020 --> 00:11:35,400 Also, wir verwenden möchten, könnten fseek überspringen über die Polsterung der in der Datei. 201 00:11:35,400 --> 00:11:39,410 Und wieder, wenn Sie stecken, gibt es ein Beispiel dafür in copy.c. 202 00:11:39,410 --> 00:11:43,260 >> So, jetzt haben wir die Datei geöffnet wird, der Schlüssel, und das Urteil. 203 00:11:43,260 --> 00:11:46,450 Wir haben den Header-Info für aktualisiert unser Urteil, denn jeder 204 00:11:46,450 --> 00:11:48,730 Bitmap braucht eine Kopfzeile. 205 00:11:48,730 --> 00:11:52,280 Wir haben dann in die Spur zu lesen Abtastlinie pixelweise wechselnden 206 00:11:52,280 --> 00:11:55,210 jede Farbe nach Bedarf, und Schreiben solcher, die in der 207 00:11:55,210 --> 00:11:57,340 Urteil, Pixel für Pixel. 208 00:11:57,340 --> 00:12:01,550 Sobald Sie Urteil öffnen, sehen Sie, wer der Täter, oder was das Geheimnis 209 00:12:01,550 --> 00:12:02,850 Nachricht ist. 210 00:12:02,850 --> 00:12:05,550 Mein Name ist Zamyla und dies war Krimi. 211 00:12:05,550 --> 00:12:12,864