1 00:00:00,000 --> 00:00:09,500 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Va ser la senyoreta Scarlett amb el canelobre. 3 00:00:12,350 --> 00:00:13,560 Qui ho va fer? 4 00:00:13,560 --> 00:00:15,030 Bé, anem a esbrinar-ho. 5 00:00:15,030 --> 00:00:20,870 A la pista joc de taula, és possible donar-se una imatge vermella física. 6 00:00:20,870 --> 00:00:24,120 I aquesta imatge és molt vermella i irregular, i el seu treball consisteix a 7 00:00:24,120 --> 00:00:25,490 revelar el missatge ocult. 8 00:00:25,490 --> 00:00:29,740 I en general vostè està proveït d'un vermell lupa, o una pantalla vermella de 9 00:00:29,740 --> 00:00:31,410 revelar que missatge ocult. 10 00:00:31,410 --> 00:00:33,340 Bé, anem a imitar això. 11 00:00:33,340 --> 00:00:37,960 >> En novel · la policíaca, se li ofereix una imatge de mapa de bits que es veu molt irregular i de color vermell, 12 00:00:37,960 --> 00:00:43,430 a continuació, executeu el programa de novel · la policíaca per revelar un missatge ocult. 13 00:00:43,430 --> 00:00:45,650 >> Així que anem a trencar aquest en passos. 14 00:00:45,650 --> 00:00:50,390 En primer lloc, que vol obrir l'arxiu - la idea que se t'ha donat. 15 00:00:50,390 --> 00:00:53,880 I llavors també crear un arxiu de mapa de bits veredicte. 16 00:00:53,880 --> 00:00:58,240 Llavors vostè desitja actualitzar el mapa de bits header info per l'arxiu de sortida veredicte. 17 00:00:58,240 --> 00:00:59,920 Més sobre això més endavant. 18 00:00:59,920 --> 00:01:04,319 I després llegiràs al pista, línia d'exploració, píxel per píxel, 19 00:01:04,319 --> 00:01:07,320 el canvi dels colors dels píxels com necessari, i l'escriptura 20 00:01:07,320 --> 00:01:08,960 aquells en què el veredicte - 21 00:01:08,960 --> 00:01:12,000 píxel per píxel al scanline veredicte. 22 00:01:12,000 --> 00:01:13,780 >> ¿Com va començar anar sobre això? 23 00:01:13,780 --> 00:01:16,940 Bé, per sort, tenim copy.c en el codi de distribució. 24 00:01:16,940 --> 00:01:21,240 I això va a demostrar molt útil per a nosaltres. 25 00:01:21,240 --> 00:01:29,700 Copy.c obre un arxiu, llegeix en aquest un cop de cap de infile i, a continuació, actualitza el 26 00:01:29,700 --> 00:01:31,070 capçalera de l'arxiu de sortida. 27 00:01:31,070 --> 00:01:37,010 I a continuació, es llegeix cada píxel al scanline, píxel per píxel, i després 28 00:01:37,010 --> 00:01:42,390 escriu que píxel a l'arxiu de sortida. 29 00:01:42,390 --> 00:01:45,020 >> Així, el primer pas podria la d'executar el següent 30 00:01:45,020 --> 00:01:46,420 comanda a la terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Això crearà una còpia de copy.c anomenat whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Així que el nostre primer pas per obrir la arxiu, així, hi ha una exacta 34 00:01:58,320 --> 00:02:00,070 rèplica que en copy.c. 35 00:02:00,070 --> 00:02:03,360 Així que et vaig a deixar de veure això. 36 00:02:03,360 --> 00:02:07,860 >> El que estem tractant en aquest PSET és / S d'arxius, tenint bàsicament arxius, 37 00:02:07,860 --> 00:02:10,229 la lectura, l'escriptura, l'edició d'ells. 38 00:02:10,229 --> 00:02:12,650 Com s'obre per primera vegada un arxiu? 39 00:02:12,650 --> 00:02:16,800 Bé, vas a declarar un arxiu punter, i després es crida a la 40 00:02:16,800 --> 00:02:18,670 fopen funció. 41 00:02:18,670 --> 00:02:23,150 Passada en el camí, o el nom d'aquesta arxiu, i després la manera que desitja 42 00:02:23,150 --> 00:02:24,700 per obrir aquest arxiu polz 43 00:02:24,700 --> 00:02:28,620 Passant en un r obrirà foo.bmp per a la lectura. 44 00:02:28,620 --> 00:02:35,670 Mentre fopen amb el pas d'una w es bar.bmp obert, per escriure l'arxiu i 45 00:02:35,670 --> 00:02:37,020 realitat editar-lo. 46 00:02:37,020 --> 00:02:41,970 >> Així que ara que hem obert l'arxiu, la nostra següent pas és actualitzar la informació de la capçalera 47 00:02:41,970 --> 00:02:43,230 per a l'arxiu de sortida. 48 00:02:43,230 --> 00:02:44,610 Què és un cap Info? 49 00:02:44,610 --> 00:02:48,160 Bé, primer hem de saber el que és un mapa de bits és. 50 00:02:48,160 --> 00:02:51,000 Un mapa de bits és un simple arranjament de octets. 51 00:02:51,000 --> 00:02:55,480 I estan declarats a l'arxiu aquí, bmp.h, amb un grup de 52 00:02:55,480 --> 00:02:58,610 la informació del que és un mapa de bits es fa realitat fora de. 53 00:02:58,610 --> 00:03:05,730 Però el que realment ens importa és la capçalera de l'arxiu de mapa de bits, aquí mateix, i 54 00:03:05,730 --> 00:03:08,460 la capçalera d'informació de mapa de bits, per aquí. 55 00:03:08,460 --> 00:03:13,170 La capçalera està composta per un parell de variables que resultaran molt útil. 56 00:03:13,170 --> 00:03:18,400 Hi ha biSizeImage, que és el La mida total de la imatge en bytes. 57 00:03:18,400 --> 00:03:20,890 I això inclou els píxels i farcit. 58 00:03:20,890 --> 00:03:24,210 El farciment és molt important, però anem a arribar a això més endavant. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth representa l'amplada de la imatge en píxels, menys el farcit. 60 00:03:30,000 --> 00:03:34,220 BiHeight és llavors també l'altura de la imatge en píxels. 61 00:03:34,220 --> 00:03:38,240 I llavors el BITMAPFILEHEADER i el BITMAPINFOHEADER, com he esmentat 62 00:03:38,240 --> 00:03:40,900 abans, els estan representats com estructures. 63 00:03:40,900 --> 00:03:45,410 Així, no es pot accedir a la capçalera del fitxer en si, sinó que voldrà arribar a 64 00:03:45,410 --> 00:03:47,370 aquestes variables a l'interior. 65 00:03:47,370 --> 00:03:48,170 >> D'acord. 66 00:03:48,170 --> 00:03:50,600 Llavors, com ens posem al dia la informació de la capçalera? 67 00:03:50,600 --> 00:03:54,020 Bé, primer hem de veure si ens necessitarà canviar qualsevol informació d' 68 00:03:54,020 --> 00:03:58,480 el infile, la pista, a la archivosalida, el veredicte. 69 00:03:58,480 --> 00:04:00,250 Hi ha alguna cosa que canvia en aquest cas? 70 00:04:00,250 --> 00:04:04,320 Bé, en realitat no, perquè anem que s'acaba de canviar els colors. 71 00:04:04,320 --> 00:04:07,550 No estarem canviant l'arxiu mida, la mida de la imatge, l'amplada, 72 00:04:07,550 --> 00:04:08,310 o l'alçada. 73 00:04:08,310 --> 00:04:14,010 Així que estàs bé de moment per simplement copiant cada píxel. 74 00:04:14,010 --> 00:04:14,840 >> D'acord. 75 00:04:14,840 --> 00:04:20,720 Així que ara anem a veure com podem realment pot llegir cada píxel de l'arxiu. 76 00:04:20,720 --> 00:04:23,640 Un altre arxiu de funció d'E / S entrarà en joc - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Es necessita en un punter a l'estructura que contindrà els bytes que 79 00:04:28,440 --> 00:04:30,110 que vostè està llegint. 80 00:04:30,110 --> 00:04:31,890 Així que vostè està llegint en això. 81 00:04:31,890 --> 00:04:36,090 I després es passa a una mida, que és la mida de cada element que 82 00:04:36,090 --> 00:04:37,360 voler llegir. 83 00:04:37,360 --> 00:04:40,640 Aquí, la funció sizeof serà molt útil. 84 00:04:40,640 --> 00:04:45,570 Després es passa en nombre, que representa el nombre d'elements de 85 00:04:45,570 --> 00:04:47,480 mida de llegir. 86 00:04:47,480 --> 00:04:51,180 I, finalment, inptr, que és el punter de l'arxiu que estàs 87 00:04:51,180 --> 00:04:52,530 va a llegir. 88 00:04:52,530 --> 00:04:58,650 Així que tots aquests elements es troben dins inptr i van a les dades. 89 00:04:58,650 --> 00:05:01,660 >> Vegem un petit exemple. 90 00:05:01,660 --> 00:05:07,590 Si vull llegir en les dades de dos gossos, bo, no puc fer-ho de dues maneres. 91 00:05:07,590 --> 00:05:15,250 Sóc capaç de llegir bé en dos objectes de mida gos del meu inptr, o puc llegir 92 00:05:15,250 --> 00:05:19,280 en un objecte de la mida de dos gossos. 93 00:05:19,280 --> 00:05:23,580 Així que ja veus que depenent de la forma que vostè disposi mida i nombre, 94 00:05:23,580 --> 00:05:25,840 pot llegir en el mateix nombre de bytes. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Així que ara, anem a canviar el color del píxel ja que necessitem. 97 00:05:33,020 --> 00:05:37,320 Si ens fixem en bmp.h nou, llavors veuràs que a la part inferior 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs són una altra estructura, on que es componen de tres bytes. 99 00:05:42,920 --> 00:05:49,220 Un, rgbtBlue, rgbtGreen, i rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Així que cada un d'ells representa la quantitat de blau, la quantitat de verd, i el 101 00:05:52,480 --> 00:05:57,250 quantitat de vermell a l'interior d'aquest píxel, on cada quantitat està representada per una 102 00:05:57,250 --> 00:05:58,670 nombre hexadecimal. 103 00:05:58,670 --> 00:06:04,370 >> Així ff0000 seran d'un color blau, ja que va des del blau, 104 00:06:04,370 --> 00:06:05,850 al verd, al vermell. 105 00:06:05,850 --> 00:06:09,300 I llavors tots els f de ser blanc. 106 00:06:09,300 --> 00:06:13,440 Fem una ullada a smiley.bmp, que que té en el seu codi de distribució. 107 00:06:13,440 --> 00:06:15,690 Si l'obre en tan sols una imatge espectador, llavors et 108 00:06:15,690 --> 00:06:17,080 només veure un smiley vermell. 109 00:06:17,080 --> 00:06:20,380 Però prendre una immersió més profunda en, anem a veure que l'estructura 110 00:06:20,380 --> 00:06:22,340 d'ell són només píxels. 111 00:06:22,340 --> 00:06:25,880 Tenim píxels blancs, i després píxels vermells. 112 00:06:25,880 --> 00:06:31,000 El ffffff blanc, i després, de la píxels vermells que he acolorit per vostè 113 00:06:31,000 --> 00:06:35,440 aquí, i veus que són 0000ff. 114 00:06:35,440 --> 00:06:39,760 Zero blau, verd a zero, i ple de color vermell. 115 00:06:39,760 --> 00:06:45,350 I ja que és somrient 08:00 píxels d'ample, no tenim cap farcit. 116 00:06:45,350 --> 00:06:47,360 Està bé. 117 00:06:47,360 --> 00:06:53,310 >> Així que si jo fos a assignar diferents valors a un RGBTRIPLE i volia 118 00:06:53,310 --> 00:06:58,350 que sigui verd, llavors el que jo faria és M'agradaria a declarar un RGBTRIPLE, anomenat 119 00:06:58,350 --> 00:07:02,660 triple, i després per accedir a tots els byte dins d'aquesta estructura el 120 00:07:02,660 --> 00:07:04,030 seria utilitzar l'operador punt. 121 00:07:04,030 --> 00:07:08,430 Així triple.rgbtBlue, puc assignar dit a 0. 122 00:07:08,430 --> 00:07:13,460 Verd puc assignar a full - qualsevol nombre, en realitat, entre 0 i ss. 123 00:07:13,460 --> 00:07:15,470 I després vermell, jo també vaig a dir 0. 124 00:07:15,470 --> 00:07:19,160 Així que això em dóna un píxel verd. 125 00:07:19,160 --> 00:07:23,030 >> A continuació, què passa si vull comprovar el valor d'alguna cosa? 126 00:07:23,030 --> 00:07:27,250 Podria tenir alguna cosa que comprova si el valor de la triple rgbtBlue és 127 00:07:27,250 --> 00:07:31,080 ff i després la impressió, "Em sento blau! ", com a resultat. 128 00:07:31,080 --> 00:07:35,640 Ara, això no vol dir necessàriament que el píxel és blau, oi? 129 00:07:35,640 --> 00:07:40,060 A causa que els valors de verd i vermell del píxel També podria tenir no 0 valors. 130 00:07:40,060 --> 00:07:43,470 Tot el que això significa, i tot el que aquesta és la comprovació que és 131 00:07:43,470 --> 00:07:45,610 d'un color blau ple. 132 00:07:45,610 --> 00:07:50,050 Però tots els píxels podrien tenir també parcial valors de color, com aquest 133 00:07:50,050 --> 00:07:52,180 següent exemple aquí. 134 00:07:52,180 --> 00:07:55,400 >> És una mica més difícil de veure el que aquesta imatge és ara. 135 00:07:55,400 --> 00:08:00,320 Això sembla una mica més a la clue.bmp que se li donarà. 136 00:08:00,320 --> 00:08:03,600 Ara, físicament, és possible solucionar això, perquè hi ha una gran quantitat de vermell, per 137 00:08:03,600 --> 00:08:07,040 que suporta una pantalla vermella de la imatge de forma que poden aparèixer els altres colors. 138 00:08:07,040 --> 00:08:10,968 Llavors, com imitar aquest amb c? 139 00:08:10,968 --> 00:08:15,640 Bé, és possible que llevem tot vermell de la imatge en la seva totalitat. 140 00:08:15,640 --> 00:08:21,870 I així, per fer que ens ho vam posar en cada valor del vermell del píxel a 0. 141 00:08:21,870 --> 00:08:25,020 I el que la imatge es veuria una mica mica com aquest, on no tenim vermell 142 00:08:25,020 --> 00:08:26,300 de cap tipus. 143 00:08:26,300 --> 00:08:29,390 >> Podem veure el missatge ocult 01:00 poc més de claredat. 144 00:08:29,390 --> 00:08:31,730 És una altra cara somrient. 145 00:08:31,730 --> 00:08:33,870 O potser podríem utilitzar un altre mètode. 146 00:08:33,870 --> 00:08:36,480 Potser, podríem identificar tots els píxels de color vermell - 147 00:08:36,480 --> 00:08:41,100 és a dir, tots els píxels amb 0 blau, verd 0, i 0 en vermell - 148 00:08:41,100 --> 00:08:43,169 i canviar els a blanc. 149 00:08:43,169 --> 00:08:45,470 I la nostra imatge pot tenir un aspecte alguna cosa com això. 150 00:08:45,470 --> 00:08:48,250 Una mica més fàcil de veure. 151 00:08:48,250 --> 00:08:51,170 >> Hi ha un munt d'altres maneres de descobrir el missatge secret, així, 152 00:08:51,170 --> 00:08:53,730 tractar amb la manipulació del color. 153 00:08:53,730 --> 00:08:57,050 Potser vostè podria utilitzar un dels mètodes que he esmentat anteriorment. 154 00:08:57,050 --> 00:08:59,600 I, a més, és possible que vulgueu per millorar alguns colors 155 00:08:59,600 --> 00:09:02,620 i dur a terme els. 156 00:09:02,620 --> 00:09:06,190 >> Així que ara que hem canviat el píxel color, al costat només hem de escriure- 157 00:09:06,190 --> 00:09:08,500 en la línia d'exploració, píxel per píxel. 158 00:09:08,500 --> 00:09:11,860 I un cop més, haurà de mirar cap enrere a copy.c, si no ha copiat 159 00:09:11,860 --> 00:09:18,170 ja, i mira el fwrite funció, que pren les dades, un punter 160 00:09:18,170 --> 00:09:23,230 a l'estructura que conté els bytes que vostè està llegint, la mida de 161 00:09:23,230 --> 00:09:26,610 els articles, el nombre d'elements, i després el outptr - 162 00:09:26,610 --> 00:09:29,450 la destinació d'aquests arxius. 163 00:09:29,450 --> 00:09:34,010 >> Després d'escriure en els píxels, se li També ha d'escriure en el farciment. 164 00:09:34,010 --> 00:09:34,970 Què és el farciment? 165 00:09:34,970 --> 00:09:38,670 Bé, cada píxel rgbt és de tres bytes de longitud. 166 00:09:38,670 --> 00:09:43,670 Però, la línia d'exploració d'imatge de mapa de bits per ha de ser un múltiple de quatre bytes. 167 00:09:43,670 --> 00:09:47,650 I si el nombre de píxels no és un múltiple de quatre, llavors hem d'afegir 168 00:09:47,650 --> 00:09:48,880 aquest farciment. 169 00:09:48,880 --> 00:09:51,420 El farciment s'acaba representat per 0s. 170 00:09:51,420 --> 00:09:54,380 Llavors, com s'escriu o llegeix això? 171 00:09:54,380 --> 00:09:59,280 Bé, resulta que no es pot padding realitat fread, però es pot 172 00:09:59,280 --> 00:10:00,970 calcular. 173 00:10:00,970 --> 00:10:04,400 >> En aquest cas, la clau i el veredicte tenen la mateixa amplada, de manera que el 174 00:10:04,400 --> 00:10:05,910 farciment és el mateix. 175 00:10:05,910 --> 00:10:09,370 I el farciment, ja veuràs en copy.c, es calcula 176 00:10:09,370 --> 00:10:11,790 amb la fórmula - 177 00:10:11,790 --> 00:10:16,690 vegades bi.biWidth sizeof (RGBTRIPLE) es donar-nos el número de bytes que el bmp 178 00:10:16,690 --> 00:10:18,280 té a cada fila. 179 00:10:18,280 --> 00:10:21,890 Des d'allà, els mòduls i restes amb 4 pot calcular la 180 00:10:21,890 --> 00:10:25,610 cal afegir la quantitat de bytes perquè el múltiple de bytes en 181 00:10:25,610 --> 00:10:27,250 cada fila és de quatre. 182 00:10:27,250 --> 00:10:30,490 >> Ara que ja tenim la fórmula per el farciment que necessitem, ara 183 00:10:30,490 --> 00:10:31,610 podem escriure-ho. 184 00:10:31,610 --> 00:10:34,080 Ara, que he esmentat abans, farciment és només 0s. 185 00:10:34,080 --> 00:10:39,730 Així que en aquest cas, només estem posant un char, en aquest cas un 0, en la nostra 186 00:10:39,730 --> 00:10:41,710 outptr - el nostre fitxer de sortida. 187 00:10:41,710 --> 00:10:47,530 Així que pot ser només fputc 0, coma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Així, mentre que hem estat llegint en la nostra arxiu arxiu d'E / S s'ha mantingut un seguiment de la nostra 189 00:10:52,400 --> 00:10:57,440 posició en els arxius amb alguna cosa anomenat l'indicador de posició del fitxer. 190 00:10:57,440 --> 00:10:59,350 Penseu en això com un cursor. 191 00:10:59,350 --> 00:11:03,550 Bàsicament, s'avança cada vegada que fread, però tenim 192 00:11:03,550 --> 00:11:05,671 el control sobre ell, també. 193 00:11:05,671 --> 00:11:11,030 >> Per moure l'indicador de posició del fitxer, pot utilitzar la funció fseek. 194 00:11:11,030 --> 00:11:15,600 Quan el inptr representa l'arxiu punter que vostè està buscant en el 195 00:11:15,600 --> 00:11:20,370 quantitat és el nombre de bytes que es hauríeu de canviar el cursor, i després de 196 00:11:20,370 --> 00:11:23,470 es refereix al punt de referència d'on es troba el cursor. 197 00:11:23,470 --> 00:11:26,770 Si passa en SEEK_CUR, que representa el corrent 198 00:11:26,770 --> 00:11:28,100 posició a l'arxiu. 199 00:11:28,100 --> 00:11:31,020 O vostè pot utilitzar alguns altres paràmetres. 200 00:11:31,020 --> 00:11:35,400 Per tant, el que es vol utilitzar fseek saltar sobre l'encoixinat l'arxiu en format. 201 00:11:35,400 --> 00:11:39,410 I de nou, si estàs encallat, hi ha un exemple d'això en copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Així que ara que hem obert l'arxiu, la pista, i el veredicte. 203 00:11:43,260 --> 00:11:46,450 Hem actualitzat la informació de la capçalera de nostre veredicte, perquè cada 204 00:11:46,450 --> 00:11:48,730 mapa de bits necessita un cop de cap. 205 00:11:48,730 --> 00:11:52,280 A continuació, hem llegit a la pista de scanline, píxel per píxel, el canvi de 206 00:11:52,280 --> 00:11:55,210 cada color, segons sigui necessari, i escriure els al 207 00:11:55,210 --> 00:11:57,340 veredicte, píxel per píxel. 208 00:11:57,340 --> 00:12:01,550 Una vegada que obri el veredicte, es pot veure que el culpable, o quin és el secret 209 00:12:01,550 --> 00:12:02,850 missatge és. 210 00:12:02,850 --> 00:12:05,550 El meu nom és Zamyla i això va ser qui ho va fer. 211 00:12:05,550 --> 00:12:12,864