[GIOCO MUSICA] ZAMYLA CHAN: E 'stata Miss Scarlett con il candelabro. Giallo? Bene, andiamo a scoprirlo. Nel Clue gioco da tavolo, si potrebbe dare una immagine fisica rosso. E che l'immagine è molto rossa e spotty, e il vostro compito è quello di rivelare il messaggio nascosto. E di solito si è fornito con un rosso lente, o uno schermo rosso rivelano che il messaggio nascosto. Beh, stiamo andando a imitare quello. In giallo, si è dato un'immagine bitmap che sembra molto discutibile e rosso, e quindi eseguire il programma di giallo per rivelare un messaggio nascosto. Quindi cerchiamo di rompere questo in fasi. In primo luogo, si desidera aprire il file - l'indizio che hai dato. E poi creare anche una il file verdetto bitmap. Poi si desidera aggiornare la bitmap intestazione informazioni per il file di output verdetto. Ne riparleremo più avanti. E allora si sta andando a leggere in indizio, scanline, pixel per pixel, cambiando i colori dei pixel come necessario, e la scrittura quelli nel verdetto - pixel per pixel nella verdetto scanline. Come si comincia andare su questo? Beh, per fortuna, abbiamo copy.c nel codice distribuzione. E questo sta a dimostrare molto utile per noi. Copy.c apre un file, si legge in quel colpo di testa di infile, e poi aggiorna il colpo di testa di file di output. E poi legge ogni pixel scanline, pixel per pixel, e quindi scrive quel pixel nel file di output. Quindi, il primo passo potrebbe essere quello di eseguire il seguente il comando nel terminale - cp copy.c whodunit.c. Questo creerà una copia di copy.c nome whodunit.c. Così il nostro primo passo per aprire la di file, beh, c'è un preciso replica di quella in copy.c. Quindi lascio a voi di guardare a quello. Quello che stiamo trattando in questo PSET è file I / O, in fondo prendendo i file, leggere, scrivere, modificarli. Come si fa a prima apre un file? Beh, si sta andando a dichiarare un file puntatore, e quindi si chiama il funzione fopen. Passare nel percorso, o il nome di tale il file, e quindi la modalità che si desidera per aprire quel file dentro Passando in un r aprirà foo.bmp per la lettura. Considerando che fopen con il passare in un w sarà bar.bmp aperto, per la scrittura il file e in realtà modificandola. Quindi, ora che abbiamo aperto il file, il nostro passo successivo è quello di aggiornare le informazioni di intestazione per il file di output. Che cosa è un colpo di testa informazioni? Beh, in primo luogo abbiamo bisogno di sapere Che bitmap è. Una bitmap è solo un semplice disposizione di byte. E sono dichiarate in questo file qui, bmp.h, con un mazzo di Informazioni di ciò che un bitmap è in realtà fatto di. Ma ciò che veramente interessa è il intestazione del file bitmap, proprio qui, e le informazioni di intestazione bitmap, qui. L'intestazione è composta da una coppia di variabili che si rivelerà molto utile. C'è biSizeImage, che è la dimensione totale dell'immagine in byte. E questo include pixel e imbottiture. L'imbottitura è molto importante, ma ci arriveremo più avanti. BiWidth rappresenta la larghezza della dell'immagine in pixel meno l'imbottitura. BiHeight è poi anche l'altezza dell'immagine in pixel. E poi il BITMAPFILEHEADER e il BITMAPINFOHEADER, come ho già detto precedenza, quelle sono rappresentati come le strutture. Quindi, non è possibile accedere al file di intestazione in sé, ma si vorrà arrivare a queste variabili all'interno. OK. Quindi, come possiamo modificare le informazioni di intestazione? Beh, prima dobbiamo vedere se ci necessario modificare alcuna informazione il infile, l'indizio, al outfile, il verdetto. C'è qualcosa cambia in questo caso? Beh, non proprio, perché stiamo andando da solo cambiando i colori. Non stiamo andando a modificare il file dimensioni, la dimensione dell'immagine, la larghezza, o l'altezza. Quindi sei tutto bene per ora da semplice copia ogni pixel. OK. Così ora diamo un'occhiata a come abbiamo effettivamente in grado di leggere ogni pixel dal file. Un altro file funzione di I / O entrerà in gioco - fread. Si impiegano in un puntatore alla struct che conterrà i byte che stai leggendo. Quindi stai leggendo in questo. E poi si passa in una dimensione, che è le dimensioni di ogni elemento che si voglia di leggere. Qui, la funzione sizeof sarà utile. Poi si passa in numero, che rappresenta il numero di elementi di formato da leggere. E poi finalmente, inptr, che è il puntatore del file che si sta andando a leggere. Quindi, tutti questi elementi sono dentro inptr e andranno a dati. Diamo un'occhiata a un piccolo esempio. Se voglio leggere in dati di due cani, bene, posso farlo uno dei due modi. Posso sia letto in due oggetti di dimensioni cane di mia inptr, o posso leggere in un oggetto delle dimensioni di due cani. Così si vede che a seconda del modo in cui che ad organizzare dimensione e numero, è può leggere nello stesso numero di byte. Così ora, cambiamo l' il colore dei pixel come abbiamo bisogno. Se guardate bmp.h di nuovo, poi vedrai che in fondo RGBTRIPLEs sono un'altra struttura, dove essi sono composti da tre byte. Uno, rgbtBlue, rgbtGreen, e rgbtRed. Così ciascuno di questi rappresenta la quantità del blu, la quantità di verde, e la quantità di rosso all'interno di questo pixel, dove ciascun importo è rappresentato da un numero esadecimale. Così ff0000 sarà un colore blu, perché va dal blu, al verde, al rosso. E poi tutte le f di sarà bianco. Diamo uno sguardo a smiley.bmp, che avete nel vostro codice di distribuzione. Se si apre in solo un'immagine visore, poi ti basta vedere uno smiley rosso. Ma un tuffo profondo nel, faremo vedere che la struttura di esso è solo pixel. Abbiamo pixel bianchi, e poi pixel rossi. Il bianco, ffffff, e poi tutto il pixel rossi che ho colorato in per voi qui, e si vede che sono 0000FF. Zero blu, zero verde e rosso pieno. E poiché smiley è larga otto pixel, non abbiamo alcuna imbottitura. Bene. Quindi, se dovessi assegnare valori differenti a un RGBTRIPLE e volevo renderlo verde, poi quello che vorrei fare è Vorrei dichiarare un RGBTRIPLE, denominato triple, e poi accedere a ogni byte all'interno di tale struct io avrebbe utilizzato l'operatore punto. Così triple.rgbtBlue, posso assegnare tale a 0. Verde posso assegnare a pieno - qualsiasi numero, in realtà, tra 0 e ff. E poi rosso, sto anche andando a dire 0. Allora che mi dà un pixel verde. Quindi, cosa succede se voglio controllare il valore di qualcosa? Potrei avere qualcosa che controlla se il valore del triplo rgbtBlue è ff e poi la stampa, "Mi sento blu ", come risultato. Ora, questo non significa necessariamente che il pixel è blu, giusto? Poiché i valori verde e rosso del pixel potrebbe anche non avere valori 0. Tutto ciò significa che, e tutto ciò che questo è il controllo per è per un colore blu completo. Ma tutti i pixel potrebbero avere anche parziale valori di colore, come questo prossimo esempio qui. E 'un po' più difficile da vedere ciò che questa immagine è ora. Questo sembra un po 'più come il clue.bmp che ti verrà dato. Ora, fisicamente, si potrebbe risolvere questo problema, perché c'è un sacco di rosso, da in possesso di uno schermo rosso per l'immagine in modo che gli altri colori possono apparire. Quindi, come possiamo imitare questo con la c? Beh, potremmo rimuovere tutto rosso l'immagine viene visualizzata. E così per farlo avremmo fissato ogni valore del rosso del pixel a 0. E così l'immagine potrebbe sembrare un po ' po 'come questo, in cui non abbiamo rosso di sorta. Possiamo vedere il messaggio nascosto un po 'più chiaramente ora. E 'un altro faccina sorridente. O forse potremmo usare un altro metodo. Forse, potremmo identificare tutti i pixel rossi - cioè, tutti i pixel con 0 blu, verde 0, e 0 red - e modificare quelli al bianco. E la nostra immagine potrebbe apparire qualcosa di simile. Un po 'più facile da vedere. Ci sono un sacco di altri modi di scoprire il messaggio segreto pure, trattare con la manipolazione del colore. Forse si potrebbe utilizzare uno dei metodi che ho citato sopra. E inoltre, si potrebbe desiderare permettono di migliorare alcuni colori e portare quelli fuori. Quindi, ora che abbiamo cambiato il pixel colore, successivo abbiamo solo bisogno di scriverle per la linea di scansione, pixel per pixel. E ancora una volta, ti consigliamo di guardare indietro a copy.c, se non avete copiato già, e cerca nella fwrite funzione, che prende i dati, un puntatore alla struttura che contiene il byte che si sta leggendo da, la dimensione gli articoli, il numero di elementi, e poi il outptr - la destinazione di tali file. Dopo si scrive in pixel, ti devono anche scrivere l'imbottitura. Che cosa è padding? Bene, ogni rgbt pixel è lungo tre byte. Ma, la linea di scansione di un'immagine bitmap deve essere un multiplo di quattro byte. E se il numero di pixel non è un multiplo di quattro, poi abbiamo bisogno di aggiungere questa imbottitura. L'imbottitura è solo rappresentata da 0. Quindi, come si scrive, o leggiamo questo? Beh, si scopre che non è possibile Imbottitura in realtà fread, ma è possibile calcolarla. In questo caso, la chiave e il giudizio hanno la stessa larghezza, così la imbottitura è lo stesso. E l'imbottitura, come si vedrà in copy.c, è calcolato con la seguente formula - Tempi bi.biWidth sizeof (RGBTRIPLE) sarà darci quanti byte il bmp ha in ogni riga. Da lì, il rollover e sottrazioni con 4 può calcolare come molti byte devono essere aggiunti in modo che multiplo di byte sul ogni riga è quattro. Ora che abbiamo la formula per quanto imbottitura abbiamo bisogno, ora possiamo scriverlo. Ora, ho accennato prima, imbottitura è solo 0. Quindi, in questo caso, stiamo solo mettendo un char, in questo caso uno 0, nel nostro outptr - il nostro outfile. Quindi, che può solo essere fputc 0, comma outptr. Così, mentre abbiamo letto nella nostra di file, file I / O ha tenuto traccia del nostro posizione in quei file con qualcosa chiamato l'indicatore di posizione del file. Pensate a come un cursore. Fondamentalmente, essa avanza ogni volta che fread, ma abbiamo controllo su di esso, anche. Per spostare l'indicatore di posizione del file, è possibile utilizzare la funzione fseek. Qualora il inptr rappresenta il file puntatore che stai cercando in, l' importo è il numero di byte che si desidera spostare il cursore, e poi da riferisce al punto di riferimento da dove si trova il cursore. Se si passa in SEEK_CUR, che rappresenta la corrente posizione del file. In alternativa è possibile utilizzare alcuni altri parametri. Quindi, potremmo voler usare fseek per saltare sopra l'imbottitura del file in. E ancora, se sei bloccato, non c'è un esempio di quella in copy.c. Così ora abbiamo aperto il file, l'indizio, e il verdetto. Abbiamo aggiornato le informazioni di intestazione per il nostro verdetto, perché ogni bitmap bisogno un'intestazione. Abbiamo poi letto in indizio di scanline, pixel per pixel, cambiando ogni colore come necessario, e la scrittura di quelle in verdetto, pixel per pixel. Una volta aperto il verdetto, si può vedere che il colpevole, o quale sia il segreto messaggio è. Il mio nome è Zamyla, e questo era giallo.