1 00:00:00,000 --> 00:00:09,500 >> [GIOCO MUSICA] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: E 'stata Miss Scarlett con il candelabro. 3 00:00:12,350 --> 00:00:13,560 Giallo? 4 00:00:13,560 --> 00:00:15,030 Bene, andiamo a scoprirlo. 5 00:00:15,030 --> 00:00:20,870 Nel Clue gioco da tavolo, si potrebbe dare una immagine fisica rosso. 6 00:00:20,870 --> 00:00:24,120 E che l'immagine è molto rossa e spotty, e il vostro compito è quello di 7 00:00:24,120 --> 00:00:25,490 rivelare il messaggio nascosto. 8 00:00:25,490 --> 00:00:29,740 E di solito si è fornito con un rosso lente, o uno schermo rosso 9 00:00:29,740 --> 00:00:31,410 rivelano che il messaggio nascosto. 10 00:00:31,410 --> 00:00:33,340 Beh, stiamo andando a imitare quello. 11 00:00:33,340 --> 00:00:37,960 >> In giallo, si è dato un'immagine bitmap che sembra molto discutibile e rosso, 12 00:00:37,960 --> 00:00:43,430 e quindi eseguire il programma di giallo per rivelare un messaggio nascosto. 13 00:00:43,430 --> 00:00:45,650 >> Quindi cerchiamo di rompere questo in fasi. 14 00:00:45,650 --> 00:00:50,390 In primo luogo, si desidera aprire il file - l'indizio che hai dato. 15 00:00:50,390 --> 00:00:53,880 E poi creare anche una il file verdetto bitmap. 16 00:00:53,880 --> 00:00:58,240 Poi si desidera aggiornare la bitmap intestazione informazioni per il file di output verdetto. 17 00:00:58,240 --> 00:00:59,920 Ne riparleremo più avanti. 18 00:00:59,920 --> 00:01:04,319 E allora si sta andando a leggere in indizio, scanline, pixel per pixel, 19 00:01:04,319 --> 00:01:07,320 cambiando i colori dei pixel come necessario, e la scrittura 20 00:01:07,320 --> 00:01:08,960 quelli nel verdetto - 21 00:01:08,960 --> 00:01:12,000 pixel per pixel nella verdetto scanline. 22 00:01:12,000 --> 00:01:13,780 >> Come si comincia andare su questo? 23 00:01:13,780 --> 00:01:16,940 Beh, per fortuna, abbiamo copy.c nel codice distribuzione. 24 00:01:16,940 --> 00:01:21,240 E questo sta a dimostrare molto utile per noi. 25 00:01:21,240 --> 00:01:29,700 Copy.c apre un file, si legge in quel colpo di testa di infile, e poi aggiorna il 26 00:01:29,700 --> 00:01:31,070 colpo di testa di file di output. 27 00:01:31,070 --> 00:01:37,010 E poi legge ogni pixel scanline, pixel per pixel, e quindi 28 00:01:37,010 --> 00:01:42,390 scrive quel pixel nel file di output. 29 00:01:42,390 --> 00:01:45,020 >> Quindi, il primo passo potrebbe essere quello di eseguire il seguente 30 00:01:45,020 --> 00:01:46,420 il comando nel terminale - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Questo creerà una copia di copy.c nome whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Così il nostro primo passo per aprire la di file, beh, c'è un preciso 34 00:01:58,320 --> 00:02:00,070 replica di quella in copy.c. 35 00:02:00,070 --> 00:02:03,360 Quindi lascio a voi di guardare a quello. 36 00:02:03,360 --> 00:02:07,860 >> Quello che stiamo trattando in questo PSET è file I / O, in fondo prendendo i file, 37 00:02:07,860 --> 00:02:10,229 leggere, scrivere, modificarli. 38 00:02:10,229 --> 00:02:12,650 Come si fa a prima apre un file? 39 00:02:12,650 --> 00:02:16,800 Beh, si sta andando a dichiarare un file puntatore, e quindi si chiama il 40 00:02:16,800 --> 00:02:18,670 funzione fopen. 41 00:02:18,670 --> 00:02:23,150 Passare nel percorso, o il nome di tale il file, e quindi la modalità che si desidera 42 00:02:23,150 --> 00:02:24,700 per aprire quel file dentro 43 00:02:24,700 --> 00:02:28,620 Passando in un r aprirà foo.bmp per la lettura. 44 00:02:28,620 --> 00:02:35,670 Considerando che fopen con il passare in un w sarà bar.bmp aperto, per la scrittura il file e 45 00:02:35,670 --> 00:02:37,020 in realtà modificandola. 46 00:02:37,020 --> 00:02:41,970 >> Quindi, ora che abbiamo aperto il file, il nostro passo successivo è quello di aggiornare le informazioni di intestazione 47 00:02:41,970 --> 00:02:43,230 per il file di output. 48 00:02:43,230 --> 00:02:44,610 Che cosa è un colpo di testa informazioni? 49 00:02:44,610 --> 00:02:48,160 Beh, in primo luogo abbiamo bisogno di sapere Che bitmap è. 50 00:02:48,160 --> 00:02:51,000 Una bitmap è solo un semplice disposizione di byte. 51 00:02:51,000 --> 00:02:55,480 E sono dichiarate in questo file qui, bmp.h, con un mazzo di 52 00:02:55,480 --> 00:02:58,610 Informazioni di ciò che un bitmap è in realtà fatto di. 53 00:02:58,610 --> 00:03:05,730 Ma ciò che veramente interessa è il intestazione del file bitmap, proprio qui, e 54 00:03:05,730 --> 00:03:08,460 le informazioni di intestazione bitmap, qui. 55 00:03:08,460 --> 00:03:13,170 L'intestazione è composta da una coppia di variabili che si rivelerà molto utile. 56 00:03:13,170 --> 00:03:18,400 C'è biSizeImage, che è la dimensione totale dell'immagine in byte. 57 00:03:18,400 --> 00:03:20,890 E questo include pixel e imbottiture. 58 00:03:20,890 --> 00:03:24,210 L'imbottitura è molto importante, ma ci arriveremo più avanti. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth rappresenta la larghezza della dell'immagine in pixel meno l'imbottitura. 60 00:03:30,000 --> 00:03:34,220 BiHeight è poi anche l'altezza dell'immagine in pixel. 61 00:03:34,220 --> 00:03:38,240 E poi il BITMAPFILEHEADER e il BITMAPINFOHEADER, come ho già detto 62 00:03:38,240 --> 00:03:40,900 precedenza, quelle sono rappresentati come le strutture. 63 00:03:40,900 --> 00:03:45,410 Quindi, non è possibile accedere al file di intestazione in sé, ma si vorrà arrivare a 64 00:03:45,410 --> 00:03:47,370 queste variabili all'interno. 65 00:03:47,370 --> 00:03:48,170 >> OK. 66 00:03:48,170 --> 00:03:50,600 Quindi, come possiamo modificare le informazioni di intestazione? 67 00:03:50,600 --> 00:03:54,020 Beh, prima dobbiamo vedere se ci necessario modificare alcuna informazione 68 00:03:54,020 --> 00:03:58,480 il infile, l'indizio, al outfile, il verdetto. 69 00:03:58,480 --> 00:04:00,250 C'è qualcosa cambia in questo caso? 70 00:04:00,250 --> 00:04:04,320 Beh, non proprio, perché stiamo andando da solo cambiando i colori. 71 00:04:04,320 --> 00:04:07,550 Non stiamo andando a modificare il file dimensioni, la dimensione dell'immagine, la larghezza, 72 00:04:07,550 --> 00:04:08,310 o l'altezza. 73 00:04:08,310 --> 00:04:14,010 Quindi sei tutto bene per ora da semplice copia ogni pixel. 74 00:04:14,010 --> 00:04:14,840 >> OK. 75 00:04:14,840 --> 00:04:20,720 Così ora diamo un'occhiata a come abbiamo effettivamente in grado di leggere ogni pixel dal file. 76 00:04:20,720 --> 00:04:23,640 Un altro file funzione di I / O entrerà in gioco - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Si impiegano in un puntatore alla struct che conterrà i byte che 79 00:04:28,440 --> 00:04:30,110 stai leggendo. 80 00:04:30,110 --> 00:04:31,890 Quindi stai leggendo in questo. 81 00:04:31,890 --> 00:04:36,090 E poi si passa in una dimensione, che è le dimensioni di ogni elemento che si 82 00:04:36,090 --> 00:04:37,360 voglia di leggere. 83 00:04:37,360 --> 00:04:40,640 Qui, la funzione sizeof sarà utile. 84 00:04:40,640 --> 00:04:45,570 Poi si passa in numero, che rappresenta il numero di elementi di 85 00:04:45,570 --> 00:04:47,480 formato da leggere. 86 00:04:47,480 --> 00:04:51,180 E poi finalmente, inptr, che è il puntatore del file che si sta 87 00:04:51,180 --> 00:04:52,530 andando a leggere. 88 00:04:52,530 --> 00:04:58,650 Quindi, tutti questi elementi sono dentro inptr e andranno a dati. 89 00:04:58,650 --> 00:05:01,660 >> Diamo un'occhiata a un piccolo esempio. 90 00:05:01,660 --> 00:05:07,590 Se voglio leggere in dati di due cani, bene, posso farlo uno dei due modi. 91 00:05:07,590 --> 00:05:15,250 Posso sia letto in due oggetti di dimensioni cane di mia inptr, o posso leggere 92 00:05:15,250 --> 00:05:19,280 in un oggetto delle dimensioni di due cani. 93 00:05:19,280 --> 00:05:23,580 Così si vede che a seconda del modo in cui che ad organizzare dimensione e numero, è 94 00:05:23,580 --> 00:05:25,840 può leggere nello stesso numero di byte. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Così ora, cambiamo l' il colore dei pixel come abbiamo bisogno. 97 00:05:33,020 --> 00:05:37,320 Se guardate bmp.h di nuovo, poi vedrai che in fondo 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs sono un'altra struttura, dove essi sono composti da tre byte. 99 00:05:42,920 --> 00:05:49,220 Uno, rgbtBlue, rgbtGreen, e rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Così ciascuno di questi rappresenta la quantità del blu, la quantità di verde, e la 101 00:05:52,480 --> 00:05:57,250 quantità di rosso all'interno di questo pixel, dove ciascun importo è rappresentato da un 102 00:05:57,250 --> 00:05:58,670 numero esadecimale. 103 00:05:58,670 --> 00:06:04,370 >> Così ff0000 sarà un colore blu, perché va dal blu, 104 00:06:04,370 --> 00:06:05,850 al verde, al rosso. 105 00:06:05,850 --> 00:06:09,300 E poi tutte le f di sarà bianco. 106 00:06:09,300 --> 00:06:13,440 Diamo uno sguardo a smiley.bmp, che avete nel vostro codice di distribuzione. 107 00:06:13,440 --> 00:06:15,690 Se si apre in solo un'immagine visore, poi ti 108 00:06:15,690 --> 00:06:17,080 basta vedere uno smiley rosso. 109 00:06:17,080 --> 00:06:20,380 Ma un tuffo profondo nel, faremo vedere che la struttura 110 00:06:20,380 --> 00:06:22,340 di esso è solo pixel. 111 00:06:22,340 --> 00:06:25,880 Abbiamo pixel bianchi, e poi pixel rossi. 112 00:06:25,880 --> 00:06:31,000 Il bianco, ffffff, e poi tutto il pixel rossi che ho colorato in per voi 113 00:06:31,000 --> 00:06:35,440 qui, e si vede che sono 0000FF. 114 00:06:35,440 --> 00:06:39,760 Zero blu, zero verde e rosso pieno. 115 00:06:39,760 --> 00:06:45,350 E poiché smiley è larga otto pixel, non abbiamo alcuna imbottitura. 116 00:06:45,350 --> 00:06:47,360 Bene. 117 00:06:47,360 --> 00:06:53,310 >> Quindi, se dovessi assegnare valori differenti a un RGBTRIPLE e volevo 118 00:06:53,310 --> 00:06:58,350 renderlo verde, poi quello che vorrei fare è Vorrei dichiarare un RGBTRIPLE, denominato 119 00:06:58,350 --> 00:07:02,660 triple, e poi accedere a ogni byte all'interno di tale struct io 120 00:07:02,660 --> 00:07:04,030 avrebbe utilizzato l'operatore punto. 121 00:07:04,030 --> 00:07:08,430 Così triple.rgbtBlue, posso assegnare tale a 0. 122 00:07:08,430 --> 00:07:13,460 Verde posso assegnare a pieno - qualsiasi numero, in realtà, tra 0 e ff. 123 00:07:13,460 --> 00:07:15,470 E poi rosso, sto anche andando a dire 0. 124 00:07:15,470 --> 00:07:19,160 Allora che mi dà un pixel verde. 125 00:07:19,160 --> 00:07:23,030 >> Quindi, cosa succede se voglio controllare il valore di qualcosa? 126 00:07:23,030 --> 00:07:27,250 Potrei avere qualcosa che controlla se il valore del triplo rgbtBlue è 127 00:07:27,250 --> 00:07:31,080 ff e poi la stampa, "Mi sento blu ", come risultato. 128 00:07:31,080 --> 00:07:35,640 Ora, questo non significa necessariamente che il pixel è blu, giusto? 129 00:07:35,640 --> 00:07:40,060 Poiché i valori verde e rosso del pixel potrebbe anche non avere valori 0. 130 00:07:40,060 --> 00:07:43,470 Tutto ciò significa che, e tutto ciò che questo è il controllo per è 131 00:07:43,470 --> 00:07:45,610 per un colore blu completo. 132 00:07:45,610 --> 00:07:50,050 Ma tutti i pixel potrebbero avere anche parziale valori di colore, come questo 133 00:07:50,050 --> 00:07:52,180 prossimo esempio qui. 134 00:07:52,180 --> 00:07:55,400 >> E 'un po' più difficile da vedere ciò che questa immagine è ora. 135 00:07:55,400 --> 00:08:00,320 Questo sembra un po 'più come il clue.bmp che ti verrà dato. 136 00:08:00,320 --> 00:08:03,600 Ora, fisicamente, si potrebbe risolvere questo problema, perché c'è un sacco di rosso, da 137 00:08:03,600 --> 00:08:07,040 in possesso di uno schermo rosso per l'immagine in modo che gli altri colori possono apparire. 138 00:08:07,040 --> 00:08:10,968 Quindi, come possiamo imitare questo con la c? 139 00:08:10,968 --> 00:08:15,640 Beh, potremmo rimuovere tutto rosso l'immagine viene visualizzata. 140 00:08:15,640 --> 00:08:21,870 E così per farlo avremmo fissato ogni valore del rosso del pixel a 0. 141 00:08:21,870 --> 00:08:25,020 E così l'immagine potrebbe sembrare un po ' po 'come questo, in cui non abbiamo rosso 142 00:08:25,020 --> 00:08:26,300 di sorta. 143 00:08:26,300 --> 00:08:29,390 >> Possiamo vedere il messaggio nascosto un po 'più chiaramente ora. 144 00:08:29,390 --> 00:08:31,730 E 'un altro faccina sorridente. 145 00:08:31,730 --> 00:08:33,870 O forse potremmo usare un altro metodo. 146 00:08:33,870 --> 00:08:36,480 Forse, potremmo identificare tutti i pixel rossi - 147 00:08:36,480 --> 00:08:41,100 cioè, tutti i pixel con 0 blu, verde 0, e 0 red - 148 00:08:41,100 --> 00:08:43,169 e modificare quelli al bianco. 149 00:08:43,169 --> 00:08:45,470 E la nostra immagine potrebbe apparire qualcosa di simile. 150 00:08:45,470 --> 00:08:48,250 Un po 'più facile da vedere. 151 00:08:48,250 --> 00:08:51,170 >> Ci sono un sacco di altri modi di scoprire il messaggio segreto pure, 152 00:08:51,170 --> 00:08:53,730 trattare con la manipolazione del colore. 153 00:08:53,730 --> 00:08:57,050 Forse si potrebbe utilizzare uno dei metodi che ho citato sopra. 154 00:08:57,050 --> 00:08:59,600 E inoltre, si potrebbe desiderare permettono di migliorare alcuni colori 155 00:08:59,600 --> 00:09:02,620 e portare quelli fuori. 156 00:09:02,620 --> 00:09:06,190 >> Quindi, ora che abbiamo cambiato il pixel colore, successivo abbiamo solo bisogno di scriverle 157 00:09:06,190 --> 00:09:08,500 per la linea di scansione, pixel per pixel. 158 00:09:08,500 --> 00:09:11,860 E ancora una volta, ti consigliamo di guardare indietro a copy.c, se non avete copiato 159 00:09:11,860 --> 00:09:18,170 già, e cerca nella fwrite funzione, che prende i dati, un puntatore 160 00:09:18,170 --> 00:09:23,230 alla struttura che contiene il byte che si sta leggendo da, la dimensione 161 00:09:23,230 --> 00:09:26,610 gli articoli, il numero di elementi, e poi il outptr - 162 00:09:26,610 --> 00:09:29,450 la destinazione di tali file. 163 00:09:29,450 --> 00:09:34,010 >> Dopo si scrive in pixel, ti devono anche scrivere l'imbottitura. 164 00:09:34,010 --> 00:09:34,970 Che cosa è padding? 165 00:09:34,970 --> 00:09:38,670 Bene, ogni rgbt pixel è lungo tre byte. 166 00:09:38,670 --> 00:09:43,670 Ma, la linea di scansione di un'immagine bitmap deve essere un multiplo di quattro byte. 167 00:09:43,670 --> 00:09:47,650 E se il numero di pixel non è un multiplo di quattro, poi abbiamo bisogno di aggiungere 168 00:09:47,650 --> 00:09:48,880 questa imbottitura. 169 00:09:48,880 --> 00:09:51,420 L'imbottitura è solo rappresentata da 0. 170 00:09:51,420 --> 00:09:54,380 Quindi, come si scrive, o leggiamo questo? 171 00:09:54,380 --> 00:09:59,280 Beh, si scopre che non è possibile Imbottitura in realtà fread, ma è possibile 172 00:09:59,280 --> 00:10:00,970 calcolarla. 173 00:10:00,970 --> 00:10:04,400 >> In questo caso, la chiave e il giudizio hanno la stessa larghezza, così la 174 00:10:04,400 --> 00:10:05,910 imbottitura è lo stesso. 175 00:10:05,910 --> 00:10:09,370 E l'imbottitura, come si vedrà in copy.c, è calcolato 176 00:10:09,370 --> 00:10:11,790 con la seguente formula - 177 00:10:11,790 --> 00:10:16,690 Tempi bi.biWidth sizeof (RGBTRIPLE) sarà darci quanti byte il bmp 178 00:10:16,690 --> 00:10:18,280 ha in ogni riga. 179 00:10:18,280 --> 00:10:21,890 Da lì, il rollover e sottrazioni con 4 può calcolare come 180 00:10:21,890 --> 00:10:25,610 molti byte devono essere aggiunti in modo che multiplo di byte sul 181 00:10:25,610 --> 00:10:27,250 ogni riga è quattro. 182 00:10:27,250 --> 00:10:30,490 >> Ora che abbiamo la formula per quanto imbottitura abbiamo bisogno, ora 183 00:10:30,490 --> 00:10:31,610 possiamo scriverlo. 184 00:10:31,610 --> 00:10:34,080 Ora, ho accennato prima, imbottitura è solo 0. 185 00:10:34,080 --> 00:10:39,730 Quindi, in questo caso, stiamo solo mettendo un char, in questo caso uno 0, nel nostro 186 00:10:39,730 --> 00:10:41,710 outptr - il nostro outfile. 187 00:10:41,710 --> 00:10:47,530 Quindi, che può solo essere fputc 0, comma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Così, mentre abbiamo letto nella nostra di file, file I / O ha tenuto traccia del nostro 189 00:10:52,400 --> 00:10:57,440 posizione in quei file con qualcosa chiamato l'indicatore di posizione del file. 190 00:10:57,440 --> 00:10:59,350 Pensate a come un cursore. 191 00:10:59,350 --> 00:11:03,550 Fondamentalmente, essa avanza ogni volta che fread, ma abbiamo 192 00:11:03,550 --> 00:11:05,671 controllo su di esso, anche. 193 00:11:05,671 --> 00:11:11,030 >> Per spostare l'indicatore di posizione del file, è possibile utilizzare la funzione fseek. 194 00:11:11,030 --> 00:11:15,600 Qualora il inptr rappresenta il file puntatore che stai cercando in, l' 195 00:11:15,600 --> 00:11:20,370 importo è il numero di byte che si desidera spostare il cursore, e poi da 196 00:11:20,370 --> 00:11:23,470 riferisce al punto di riferimento da dove si trova il cursore. 197 00:11:23,470 --> 00:11:26,770 Se si passa in SEEK_CUR, che rappresenta la corrente 198 00:11:26,770 --> 00:11:28,100 posizione del file. 199 00:11:28,100 --> 00:11:31,020 In alternativa è possibile utilizzare alcuni altri parametri. 200 00:11:31,020 --> 00:11:35,400 Quindi, potremmo voler usare fseek per saltare sopra l'imbottitura del file in. 201 00:11:35,400 --> 00:11:39,410 E ancora, se sei bloccato, non c'è un esempio di quella in copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Così ora abbiamo aperto il file, l'indizio, e il verdetto. 203 00:11:43,260 --> 00:11:46,450 Abbiamo aggiornato le informazioni di intestazione per il nostro verdetto, perché ogni 204 00:11:46,450 --> 00:11:48,730 bitmap bisogno un'intestazione. 205 00:11:48,730 --> 00:11:52,280 Abbiamo poi letto in indizio di scanline, pixel per pixel, cambiando 206 00:11:52,280 --> 00:11:55,210 ogni colore come necessario, e la scrittura di quelle in 207 00:11:55,210 --> 00:11:57,340 verdetto, pixel per pixel. 208 00:11:57,340 --> 00:12:01,550 Una volta aperto il verdetto, si può vedere che il colpevole, o quale sia il segreto 209 00:12:01,550 --> 00:12:02,850 messaggio è. 210 00:12:02,850 --> 00:12:05,550 Il mio nome è Zamyla, e questo era giallo. 211 00:12:05,550 --> 00:12:12,864