[REPRODUCCIÓ DE MÚSICA] ZAMYLA CHAN: Va ser la senyoreta Scarlett amb el canelobre. Qui ho va fer? Bé, anem a esbrinar-ho. A la pista joc de taula, és possible donar-se una imatge vermella física. I aquesta imatge és molt vermella i irregular, i el seu treball consisteix a revelar el missatge ocult. I en general vostè està proveït d'un vermell lupa, o una pantalla vermella de revelar que missatge ocult. Bé, anem a imitar això. En novel · la policíaca, se li ofereix una imatge de mapa de bits que es veu molt irregular i de color vermell, a continuació, executeu el programa de novel · la policíaca per revelar un missatge ocult. Així que anem a trencar aquest en passos. En primer lloc, que vol obrir l'arxiu - la idea que se t'ha donat. I llavors també crear un arxiu de mapa de bits veredicte. Llavors vostè desitja actualitzar el mapa de bits header info per l'arxiu de sortida veredicte. Més sobre això més endavant. I després llegiràs al pista, línia d'exploració, píxel per píxel, el canvi dels colors dels píxels com necessari, i l'escriptura aquells en què el veredicte - píxel per píxel al scanline veredicte. ¿Com va començar anar sobre això? Bé, per sort, tenim copy.c en el codi de distribució. I això va a demostrar molt útil per a nosaltres. Copy.c obre un arxiu, llegeix en aquest un cop de cap de infile i, a continuació, actualitza el capçalera de l'arxiu de sortida. I a continuació, es llegeix cada píxel al scanline, píxel per píxel, i després escriu que píxel a l'arxiu de sortida. Així, el primer pas podria la d'executar el següent comanda a la terminal - cp copy.c whodunit.c. Això crearà una còpia de copy.c anomenat whodunit.c. Així que el nostre primer pas per obrir la arxiu, així, hi ha una exacta rèplica que en copy.c. Així que et vaig a deixar de veure això. El que estem tractant en aquest PSET és / S d'arxius, tenint bàsicament arxius, la lectura, l'escriptura, l'edició d'ells. Com s'obre per primera vegada un arxiu? Bé, vas a declarar un arxiu punter, i després es crida a la fopen funció. Passada en el camí, o el nom d'aquesta arxiu, i després la manera que desitja per obrir aquest arxiu polz Passant en un r obrirà foo.bmp per a la lectura. Mentre fopen amb el pas d'una w es bar.bmp obert, per escriure l'arxiu i realitat editar-lo. Així que ara que hem obert l'arxiu, la nostra següent pas és actualitzar la informació de la capçalera per a l'arxiu de sortida. Què és un cap Info? Bé, primer hem de saber el que és un mapa de bits és. Un mapa de bits és un simple arranjament de octets. I estan declarats a l'arxiu aquí, bmp.h, amb un grup de la informació del que és un mapa de bits es fa realitat fora de. Però el que realment ens importa és la capçalera de l'arxiu de mapa de bits, aquí mateix, i la capçalera d'informació de mapa de bits, per aquí. La capçalera està composta per un parell de variables que resultaran molt útil. Hi ha biSizeImage, que és el La mida total de la imatge en bytes. I això inclou els píxels i farcit. El farciment és molt important, però anem a arribar a això més endavant. BiWidth representa l'amplada de la imatge en píxels, menys el farcit. BiHeight és llavors també l'altura de la imatge en píxels. I llavors el BITMAPFILEHEADER i el BITMAPINFOHEADER, com he esmentat abans, els estan representats com estructures. Així, no es pot accedir a la capçalera del fitxer en si, sinó que voldrà arribar a aquestes variables a l'interior. D'acord. Llavors, com ens posem al dia la informació de la capçalera? Bé, primer hem de veure si ens necessitarà canviar qualsevol informació d' el infile, la pista, a la archivosalida, el veredicte. Hi ha alguna cosa que canvia en aquest cas? Bé, en realitat no, perquè anem que s'acaba de canviar els colors. No estarem canviant l'arxiu mida, la mida de la imatge, l'amplada, o l'alçada. Així que estàs bé de moment per simplement copiant cada píxel. D'acord. Així que ara anem a veure com podem realment pot llegir cada píxel de l'arxiu. Un altre arxiu de funció d'E / S entrarà en joc - fread. Es necessita en un punter a l'estructura que contindrà els bytes que que vostè està llegint. Així que vostè està llegint en això. I després es passa a una mida, que és la mida de cada element que voler llegir. Aquí, la funció sizeof serà molt útil. Després es passa en nombre, que representa el nombre d'elements de mida de llegir. I, finalment, inptr, que és el punter de l'arxiu que estàs va a llegir. Així que tots aquests elements es troben dins inptr i van a les dades. Vegem un petit exemple. Si vull llegir en les dades de dos gossos, bo, no puc fer-ho de dues maneres. Sóc capaç de llegir bé en dos objectes de mida gos del meu inptr, o puc llegir en un objecte de la mida de dos gossos. Així que ja veus que depenent de la forma que vostè disposi mida i nombre, pot llegir en el mateix nombre de bytes. Així que ara, anem a canviar el color del píxel ja que necessitem. Si ens fixem en bmp.h nou, llavors veuràs que a la part inferior RGBTRIPLEs són una altra estructura, on que es componen de tres bytes. Un, rgbtBlue, rgbtGreen, i rgbtRed. Així que cada un d'ells representa la quantitat de blau, la quantitat de verd, i el quantitat de vermell a l'interior d'aquest píxel, on cada quantitat està representada per una nombre hexadecimal. Així ff0000 seran d'un color blau, ja que va des del blau, al verd, al vermell. I llavors tots els f de ser blanc. Fem una ullada a smiley.bmp, que que té en el seu codi de distribució. Si l'obre en tan sols una imatge espectador, llavors et només veure un smiley vermell. Però prendre una immersió més profunda en, anem a veure que l'estructura d'ell són només píxels. Tenim píxels blancs, i després píxels vermells. El ffffff blanc, i després, de la píxels vermells que he acolorit per vostè aquí, i veus que són 0000ff. Zero blau, verd a zero, i ple de color vermell. I ja que és somrient 08:00 píxels d'ample, no tenim cap farcit. Està bé. Així que si jo fos a assignar diferents valors a un RGBTRIPLE i volia que sigui verd, llavors el que jo faria és M'agradaria a declarar un RGBTRIPLE, anomenat triple, i després per accedir a tots els byte dins d'aquesta estructura el seria utilitzar l'operador punt. Així triple.rgbtBlue, puc assignar dit a 0. Verd puc assignar a full - qualsevol nombre, en realitat, entre 0 i ss. I després vermell, jo també vaig a dir 0. Així que això em dóna un píxel verd. A continuació, què passa si vull comprovar el valor d'alguna cosa? Podria tenir alguna cosa que comprova si el valor de la triple rgbtBlue és ff i després la impressió, "Em sento blau! ", com a resultat. Ara, això no vol dir necessàriament que el píxel és blau, oi? A causa que els valors de verd i vermell del píxel També podria tenir no 0 valors. Tot el que això significa, i tot el que aquesta és la comprovació que és d'un color blau ple. Però tots els píxels podrien tenir també parcial valors de color, com aquest següent exemple aquí. És una mica més difícil de veure el que aquesta imatge és ara. Això sembla una mica més a la clue.bmp que se li donarà. Ara, físicament, és possible solucionar això, perquè hi ha una gran quantitat de vermell, per que suporta una pantalla vermella de la imatge de forma que poden aparèixer els altres colors. Llavors, com imitar aquest amb c? Bé, és possible que llevem tot vermell de la imatge en la seva totalitat. I així, per fer que ens ho vam posar en cada valor del vermell del píxel a 0. I el que la imatge es veuria una mica mica com aquest, on no tenim vermell de cap tipus. Podem veure el missatge ocult 01:00 poc més de claredat. És una altra cara somrient. O potser podríem utilitzar un altre mètode. Potser, podríem identificar tots els píxels de color vermell - és a dir, tots els píxels amb 0 blau, verd 0, i 0 en vermell - i canviar els a blanc. I la nostra imatge pot tenir un aspecte alguna cosa com això. Una mica més fàcil de veure. Hi ha un munt d'altres maneres de descobrir el missatge secret, així, tractar amb la manipulació del color. Potser vostè podria utilitzar un dels mètodes que he esmentat anteriorment. I, a més, és possible que vulgueu per millorar alguns colors i dur a terme els. Així que ara que hem canviat el píxel color, al costat només hem de escriure- en la línia d'exploració, píxel per píxel. I un cop més, haurà de mirar cap enrere a copy.c, si no ha copiat ja, i mira el fwrite funció, que pren les dades, un punter a l'estructura que conté els bytes que vostè està llegint, la mida de els articles, el nombre d'elements, i després el outptr - la destinació d'aquests arxius. Després d'escriure en els píxels, se li També ha d'escriure en el farciment. Què és el farciment? Bé, cada píxel rgbt és de tres bytes de longitud. Però, la línia d'exploració d'imatge de mapa de bits per ha de ser un múltiple de quatre bytes. I si el nombre de píxels no és un múltiple de quatre, llavors hem d'afegir aquest farciment. El farciment s'acaba representat per 0s. Llavors, com s'escriu o llegeix això? Bé, resulta que no es pot padding realitat fread, però es pot calcular. En aquest cas, la clau i el veredicte tenen la mateixa amplada, de manera que el farciment és el mateix. I el farciment, ja veuràs en copy.c, es calcula amb la fórmula - vegades bi.biWidth sizeof (RGBTRIPLE) es donar-nos el número de bytes que el bmp té a cada fila. Des d'allà, els mòduls i restes amb 4 pot calcular la cal afegir la quantitat de bytes perquè el múltiple de bytes en cada fila és de quatre. Ara que ja tenim la fórmula per el farciment que necessitem, ara podem escriure-ho. Ara, que he esmentat abans, farciment és només 0s. Així que en aquest cas, només estem posant un char, en aquest cas un 0, en la nostra outptr - el nostre fitxer de sortida. Així que pot ser només fputc 0, coma outptr. Així, mentre que hem estat llegint en la nostra arxiu arxiu d'E / S s'ha mantingut un seguiment de la nostra posició en els arxius amb alguna cosa anomenat l'indicador de posició del fitxer. Penseu en això com un cursor. Bàsicament, s'avança cada vegada que fread, però tenim el control sobre ell, també. Per moure l'indicador de posició del fitxer, pot utilitzar la funció fseek. Quan el inptr representa l'arxiu punter que vostè està buscant en el quantitat és el nombre de bytes que es hauríeu de canviar el cursor, i després de es refereix al punt de referència d'on es troba el cursor. Si passa en SEEK_CUR, que representa el corrent posició a l'arxiu. O vostè pot utilitzar alguns altres paràmetres. Per tant, el que es vol utilitzar fseek saltar sobre l'encoixinat l'arxiu en format. I de nou, si estàs encallat, hi ha un exemple d'això en copy.c. Així que ara que hem obert l'arxiu, la pista, i el veredicte. Hem actualitzat la informació de la capçalera de nostre veredicte, perquè cada mapa de bits necessita un cop de cap. A continuació, hem llegit a la pista de scanline, píxel per píxel, el canvi de cada color, segons sigui necessari, i escriure els al veredicte, píxel per píxel. Una vegada que obri el veredicte, es pot veure que el culpable, o quin és el secret missatge és. El meu nom és Zamyla i això va ser qui ho va fer.