1 00:00:00,000 --> 00:00:09,500 >> [Música tocando] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Foi señorita Scarlett co castiçal. 3 00:00:12,350 --> 00:00:13,560 Whodunit? 4 00:00:13,560 --> 00:00:15,030 Ben, imos descubrir. 5 00:00:15,030 --> 00:00:20,870 No Clue xogo de mesa, pode ser dada unha imaxe vermella física. 6 00:00:20,870 --> 00:00:24,120 E esa imaxe é moi vermello e irregular, eo seu traballo é 7 00:00:24,120 --> 00:00:25,490 revelar a mensaxe oculta. 8 00:00:25,490 --> 00:00:29,740 E, xeralmente, está equipado cun vermello lupa, ou unha pantalla vermella para 9 00:00:29,740 --> 00:00:31,410 revelan que a mensaxe oculta. 10 00:00:31,410 --> 00:00:33,340 Ben, nós estamos indo a imitar iso. 11 00:00:33,340 --> 00:00:37,960 >> Na novela policial, está dado unha imaxe bitmap que se parece moi irregular e vermello, 12 00:00:37,960 --> 00:00:43,430 e, a continuación, realizar o programa whodunit para revelar unha mensaxe oculta. 13 00:00:43,430 --> 00:00:45,650 >> Entón, imos romper iso en etapas. 14 00:00:45,650 --> 00:00:50,390 En primeiro lugar, quere abrir o arquivo - a pista que lle foi dado. 15 00:00:50,390 --> 00:00:53,880 E despois tamén crear un arquivo veredicto bitmap. 16 00:00:53,880 --> 00:00:58,240 Entón quere actualizar o mapa de bits cabeceira información para o outfile veredicto. 17 00:00:58,240 --> 00:00:59,920 Máis sobre iso máis tarde. 18 00:00:59,920 --> 00:01:04,319 E entón vai ler na pista, scanline, pixel por pixel, 19 00:01:04,319 --> 00:01:07,320 cambiando as cores do pixel como necesario, e escrita 20 00:01:07,320 --> 00:01:08,960 aqueles en que o veredicto - 21 00:01:08,960 --> 00:01:12,000 pixel por pixel na scanline veredicto. 22 00:01:12,000 --> 00:01:13,780 >> Como é que imos comezar a ir a este respecto? 23 00:01:13,780 --> 00:01:16,940 Ben, por sorte, temos copy.c no código de distribución. 24 00:01:16,940 --> 00:01:21,240 E iso vai probar moi útil para nós. 25 00:01:21,240 --> 00:01:29,700 Copy.c abre un ficheiro, le nese cabeceira do infile, e actualiza o 26 00:01:29,700 --> 00:01:31,070 cabeceira do ficheiro de saída. 27 00:01:31,070 --> 00:01:37,010 E, a continuación, le-se cada pixel na scanline, pixel por pixel, e, a continuación, 28 00:01:37,010 --> 00:01:42,390 escribe que de píxeles para o arquivo de saída. 29 00:01:42,390 --> 00:01:45,020 >> Entón, o primeiro paso pode a de realizar o seguinte 30 00:01:45,020 --> 00:01:46,420 orde na terminal - 31 00:01:46,420 --> 00:01:50,270 cp copy.c whodunit.c. 32 00:01:50,270 --> 00:01:55,320 Isto creará unha copia de copy.c chamado whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Así, o noso primeiro paso para abrir o arquivo, así, hai unha exacta 34 00:01:58,320 --> 00:02:00,070 réplica do que en copy.c. 35 00:02:00,070 --> 00:02:03,360 Entón, eu vou deixar ollar para iso. 36 00:02:03,360 --> 00:02:07,860 >> O que estamos lidando neste PSET é ficheiro E /, basicamente tomando arquivos, 37 00:02:07,860 --> 00:02:10,229 lectura, escritura, editalos. 38 00:02:10,229 --> 00:02:12,650 Como abrir un arquivo? 39 00:02:12,650 --> 00:02:16,800 Ben, está indo a declarar un ficheiro punteiro, e despois chamar o 40 00:02:16,800 --> 00:02:18,670 función fopen. 41 00:02:18,670 --> 00:02:23,150 Pase no camiño, ou o nome da ficheiro e, a continuación, o xeito que quere 42 00:02:23,150 --> 00:02:24,700 para abrir este ficheiro dentro 43 00:02:24,700 --> 00:02:28,620 Pasando unha r abrirá foo.bmp á lectura. 44 00:02:28,620 --> 00:02:35,670 Considerando fopen con pasando un w vai bar.bmp aberto, para gardar o ficheiro e 45 00:02:35,670 --> 00:02:37,020 realmente editalo. 46 00:02:37,020 --> 00:02:41,970 >> Polo tanto, agora que abriu o ficheiro, o noso seguinte paso é actualizar a información da cabeceira 47 00:02:41,970 --> 00:02:43,230 para o arquivo de saída. 48 00:02:43,230 --> 00:02:44,610 ¿Que é unha información de cabeceira? 49 00:02:44,610 --> 00:02:48,160 Ben, primeiro necesitamos saber o que é un mapa de bits é. 50 00:02:48,160 --> 00:02:51,000 Un mapa de bits é só un simple arranxo de bytes. 51 00:02:51,000 --> 00:02:55,480 E eles están declarados neste arquivo aquí, bmp.h, con unha morea de 52 00:02:55,480 --> 00:02:58,610 información do que un mapa de bits é realmente feita de fóra. 53 00:02:58,610 --> 00:03:05,730 Pero o que realmente importa é o cabeceira do ficheiro de mapa de bits, así aquí, e 54 00:03:05,730 --> 00:03:08,460 a información bitmap cabeceira, aquí. 55 00:03:08,460 --> 00:03:13,170 A cabeceira está formado por un par de variables que pode ser moi útil. 56 00:03:13,170 --> 00:03:18,400 Hai biSizeImage, que é o tamaño da imaxe en bytes. 57 00:03:18,400 --> 00:03:20,890 E iso inclúe píxeles e estofado. 58 00:03:20,890 --> 00:03:24,210 Padding é moi importante, pero nós imos chegar a iso máis tarde. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth representa a anchura da imaxe en píxeles menos o estofado. 60 00:03:30,000 --> 00:03:34,220 BiHeight é entón tamén a altura da imaxe en píxeles. 61 00:03:34,220 --> 00:03:38,240 E, a continuación, o BITMAPFILEHEADER ea BITMAPINFOHEADER, como mencionei 62 00:03:38,240 --> 00:03:40,900 anterior, aqueles representados como estruturas. 63 00:03:40,900 --> 00:03:45,410 Entón, vostede non pode acceder a cabeceira do ficheiro si mesmo, pero vai querer comezar a 64 00:03:45,410 --> 00:03:47,370 estas variables dentro. 65 00:03:47,370 --> 00:03:48,170 >> Aceptar. 66 00:03:48,170 --> 00:03:50,600 Entón, como imos actualizar a información da cabeceira? 67 00:03:50,600 --> 00:03:54,020 Ben, primeiro temos que ver se nós Debe cambiar calquera información do 68 00:03:54,020 --> 00:03:58,480 o infile, a pista, co outfile, o veredicto. 69 00:03:58,480 --> 00:04:00,250 Calquera cousa está cambiando neste caso? 70 00:04:00,250 --> 00:04:04,320 Ben, non realmente, porque nós imos para ser só cambiando as cores. 71 00:04:04,320 --> 00:04:07,550 Non imos estar cambiando o arquivo o tamaño, o tamaño da imaxe, a anchura, 72 00:04:07,550 --> 00:04:08,310 ou a altura. 73 00:04:08,310 --> 00:04:14,010 Entón, está ben por agora por só copiando cada pixel. 74 00:04:14,010 --> 00:04:14,840 >> Aceptar. 75 00:04:14,840 --> 00:04:20,720 Entón agora imos ollar como nós, en realidade, pode ler cada pixel do arquivo. 76 00:04:20,720 --> 00:04:23,640 Outro arquivo función I / O vai entrar en xogo - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Ten en un punteiro para a struct que conterá os bytes 79 00:04:28,440 --> 00:04:30,110 estás lendo. 80 00:04:30,110 --> 00:04:31,890 Entón está lendo para iso. 81 00:04:31,890 --> 00:04:36,090 E entón pasa nun tamaño, que é o tamaño de cada elemento que lle 82 00:04:36,090 --> 00:04:37,360 quere ler. 83 00:04:37,360 --> 00:04:40,640 Aquí, a función sizeof virá a cadra. 84 00:04:40,640 --> 00:04:45,570 Entón pasa en número, que representa o número de elementos de 85 00:04:45,570 --> 00:04:47,480 tamaño de ler. 86 00:04:47,480 --> 00:04:51,180 E, a continuación, por fin, inptr, que é o punteiro do ficheiro que está 87 00:04:51,180 --> 00:04:52,530 indo a ler. 88 00:04:52,530 --> 00:04:58,650 Entón, todos estes elementos están dentro inptr e están indo a datos. 89 00:04:58,650 --> 00:05:01,660 >> Vexamos un pequeno exemplo. 90 00:05:01,660 --> 00:05:07,590 Se quero ler en datos de dous cans, ben, eu podo facelo de dous xeitos. 91 00:05:07,590 --> 00:05:15,250 I pode ler en dous obxectos de tamaño can do meu inptr, ou podo ler 92 00:05:15,250 --> 00:05:19,280 nun obxecto do tamaño de dous cans. 93 00:05:19,280 --> 00:05:23,580 Entón ve que, dependendo da forma que organice tamaño e número, 94 00:05:23,580 --> 00:05:25,840 pode ler o mesmo número de bytes. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Entón, agora, imos cambiar o píxeles de cor como necesitamos. 97 00:05:33,020 --> 00:05:37,320 Se ollar para bmp.h novo, entón podes ver que na parte inferior 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs son outra estrutura, onde eles constan de tres bytes. 99 00:05:42,920 --> 00:05:49,220 Un, rgbtBlue, rgbtGreen, e rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Así, cada un deles representa a cantidade de azul, a cantidade de verde, eo 101 00:05:52,480 --> 00:05:57,250 cantidade de vermello dentro deste píxel, onde cada valor é representado por un 102 00:05:57,250 --> 00:05:58,670 número hexadecimal. 103 00:05:58,670 --> 00:06:04,370 >> Entón FF0000 será unha cor azul, porque vai de azul, 104 00:06:04,370 --> 00:06:05,850 a verde, a vermella. 105 00:06:05,850 --> 00:06:09,300 E entón, f será de branco. 106 00:06:09,300 --> 00:06:13,440 Imos dar un ollo a smiley.bmp, que ten no seu código de distribución. 107 00:06:13,440 --> 00:06:15,690 Se abrilo en só unha imaxe espectador, entón 108 00:06:15,690 --> 00:06:17,080 basta ver un Smiley vermello. 109 00:06:17,080 --> 00:06:20,380 Pero tomar un mergullo máis profundo en, imos ver que a estrutura 110 00:06:20,380 --> 00:06:22,340 de que é só píxeles. 111 00:06:22,340 --> 00:06:25,880 Temos píxeles brancos, e logo, vermello píxeles. 112 00:06:25,880 --> 00:06:31,000 O branco, ffffff, e entón todo o píxeles vermellos Eu cores en para ti 113 00:06:31,000 --> 00:06:35,440 aquí, e ve que están 0000ff. 114 00:06:35,440 --> 00:06:39,760 Cero azul, verde cero, e cheo vermello. 115 00:06:39,760 --> 00:06:45,350 E xa que Smiley é de oito píxeles de ancho, non temos ningún recheo. 116 00:06:45,350 --> 00:06:47,360 Todo ben. 117 00:06:47,360 --> 00:06:53,310 >> Entón, se eu fose para asignar valores distintos a un RGBTRIPLE e eu quería 118 00:06:53,310 --> 00:06:58,350 facelo verde, entón o que me gustaría facer é Quere declarar un RGBTRIPLE, nomeado 119 00:06:58,350 --> 00:07:02,660 triple, logo para acceder cada byte en que a estrutura I 120 00:07:02,660 --> 00:07:04,030 usaría o operador punto. 121 00:07:04,030 --> 00:07:08,430 Entón triple.rgbtBlue, podo asignar que a 0. 122 00:07:08,430 --> 00:07:13,460 Verde podo atribuílo lo a foto - calquera número, en realidade, entre 0 e ss. 123 00:07:13,460 --> 00:07:15,470 E, a continuación, vermello, eu tamén vou dicir a 0. 124 00:07:15,470 --> 00:07:19,160 Entón iso me dá un pixel verde. 125 00:07:19,160 --> 00:07:23,030 >> A continuación, o que se eu queira comprobar o valor de algo? 126 00:07:23,030 --> 00:07:27,250 Podería ter algo que comprobar O valor rgbtBlue do triplo é 127 00:07:27,250 --> 00:07:31,080 ff e, a continuación, imprimir, "Estou me sentido azul ", como un resultado. 128 00:07:31,080 --> 00:07:35,640 Agora, iso non significa necesariamente que o pixel é azul, non? 129 00:07:35,640 --> 00:07:40,060 Como os valores verdes e vermellas do píxeles Tamén pode ter valores non-0. 130 00:07:40,060 --> 00:07:43,470 Todo o que iso significa, e todo o que este está comprobando é 131 00:07:43,470 --> 00:07:45,610 a unha cor azul completa. 132 00:07:45,610 --> 00:07:50,050 Pero todos os píxeles tamén podería parcial valores de cor, como este 133 00:07:50,050 --> 00:07:52,180 seguinte exemplo aquí. 134 00:07:52,180 --> 00:07:55,400 >> É un pouco máis difícil de ver o que esta imaxe é agora. 135 00:07:55,400 --> 00:08:00,320 Isto parece un pouco máis parecido ao clue.bmp que vai ser dada. 136 00:08:00,320 --> 00:08:03,600 Agora, fisicamente, pode resolver iso, porque hai unha morea de vermello, por 137 00:08:03,600 --> 00:08:07,040 sostendo unha pantalla vermella para a imaxe de xeito que as outras cores poden aparecer. 138 00:08:07,040 --> 00:08:10,968 Entón, como podemos imitar esta con c? 139 00:08:10,968 --> 00:08:15,640 Así, podemos eliminar todo vermello a partir da imaxe totalmente. 140 00:08:15,640 --> 00:08:21,870 E así facer que iríamos establecer cada valor vermello pixel a 0. 141 00:08:21,870 --> 00:08:25,020 E así a imaxe quedaría un pouco pouco como este, onde non temos vermello 142 00:08:25,020 --> 00:08:26,300 calquera. 143 00:08:26,300 --> 00:08:29,390 >> Podemos ver a mensaxe dunha oculta pouco máis claramente agora. 144 00:08:29,390 --> 00:08:31,730 É máis un rostro sorrinte. 145 00:08:31,730 --> 00:08:33,870 Ou quizais poderiamos usar outro método. 146 00:08:33,870 --> 00:08:36,480 Quizais, poderiamos identificar todos os píxeles vermellos - 147 00:08:36,480 --> 00:08:41,100 é dicir, todos os píxeles con 0 azul, verde 0 e 0 vermello - 148 00:08:41,100 --> 00:08:43,169 e cambiar aqueles para branco. 149 00:08:43,169 --> 00:08:45,470 E a nosa imaxe pode parecer algo así. 150 00:08:45,470 --> 00:08:48,250 Un pouco máis fácil de ver. 151 00:08:48,250 --> 00:08:51,170 >> Hai moitas outras formas de descubrir a mensaxe secreta, así como, 152 00:08:51,170 --> 00:08:53,730 xestione o manexo de memoria. 153 00:08:53,730 --> 00:08:57,050 Quizais pode usar un dos métodos que eu mencionen anteriormente. 154 00:08:57,050 --> 00:08:59,600 E ademais, pode querer para mellorar algunhas cores 155 00:08:59,600 --> 00:09:02,620 e levar os para fóra. 156 00:09:02,620 --> 00:09:06,190 >> Polo tanto, agora que nós cambiamos o píxel cor, xunto só necesitamos gravala-los 157 00:09:06,190 --> 00:09:08,500 en que a liña de varrido, pixel por pixel. 158 00:09:08,500 --> 00:09:11,860 E unha vez máis, vai querer ollar cara atrás para copy.c, se non copiou 159 00:09:11,860 --> 00:09:18,170 xa, e mirar para o fwrite función, a cal leva datos, un punteiro 160 00:09:18,170 --> 00:09:23,230 para a estrutura que contén o bytes que estás lendo a partir, o tamaño da 161 00:09:23,230 --> 00:09:26,610 os elementos, o número de elementos, e, a continuación, o outptr - 162 00:09:26,610 --> 00:09:29,450 o destino deses arquivos. 163 00:09:29,450 --> 00:09:34,010 >> Despois de escribir nos píxeles, vai Tamén ten que escribir no estofado. 164 00:09:34,010 --> 00:09:34,970 Qué é o recheo? 165 00:09:34,970 --> 00:09:38,670 Ben, cada pixel RGBT é de tres bytes. 166 00:09:38,670 --> 00:09:43,670 Pero a liña de varrido dunha imaxe de mapa de bits para ten que ser un múltiplo de catro bytes. 167 00:09:43,670 --> 00:09:47,650 O número de píxeles non é un múltiplo de catro, entón necesitamos engadir 168 00:09:47,650 --> 00:09:48,880 este recheo. 169 00:09:48,880 --> 00:09:51,420 O recheo é só representado por 0s. 170 00:09:51,420 --> 00:09:54,380 Entón, como é que imos escribir ou ler isto? 171 00:09:54,380 --> 00:09:59,280 Ben, acontece que non pode estofado realmente fread, pero pode 172 00:09:59,280 --> 00:10:00,970 calcula-lo. 173 00:10:00,970 --> 00:10:04,400 >> Neste caso, a pista eo veredicto teñen o mesmo ancho, de xeito que o 174 00:10:04,400 --> 00:10:05,910 acolchado é a mesma. 175 00:10:05,910 --> 00:10:09,370 E o recheo, como podes ver en copy.c, calcúlase 176 00:10:09,370 --> 00:10:11,790 coa seguinte fórmula - 177 00:10:11,790 --> 00:10:16,690 bi.biWidth veces sizeof (RGBTRIPLE) vai deixa-nos cantos bytes a bmp 178 00:10:16,690 --> 00:10:18,280 ten en cada liña. 179 00:10:18,280 --> 00:10:21,890 De alí, os módulos e restas con 4 pode calcular canto 180 00:10:21,890 --> 00:10:25,610 debe ser engadido a fin de que moitos bytes o múltiplo de bytes en 181 00:10:25,610 --> 00:10:27,250 Cada liña é catro. 182 00:10:27,250 --> 00:10:30,490 >> Agora que temos a fórmula como estofado que necesitamos agora 183 00:10:30,490 --> 00:10:31,610 podemos escribilo. 184 00:10:31,610 --> 00:10:34,080 Agora, eu mencionen antes, recheo é só 0s. 185 00:10:34,080 --> 00:10:39,730 Entón, nese caso, estamos só poñendo char, neste caso, un 0, a nosa 186 00:10:39,730 --> 00:10:41,710 outptr - noso outfile. 187 00:10:41,710 --> 00:10:47,530 Entón isto pode ser só fputc 0, coma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Así, mentres nós temos a lectura na nosa arquivo, ficheiro E / mantivo o control da nosa 189 00:10:52,400 --> 00:10:57,440 posición neses ficheiros con algo chamado o indicador de posición de arquivo. 190 00:10:57,440 --> 00:10:59,350 Pense nisso como un cursor. 191 00:10:59,350 --> 00:11:03,550 Basicamente, ela avanza cada vez que fread, pero temos 192 00:11:03,550 --> 00:11:05,671 control sobre iso, tamén. 193 00:11:05,671 --> 00:11:11,030 >> Para mover o indicador de posición de arquivo, pode usar a función fseek. 194 00:11:11,030 --> 00:11:15,600 Cando o inptr representa o ficheiro punteiro que está a buscar, en, a 195 00:11:15,600 --> 00:11:20,370 importe é o número de bytes que quere mover o cursor e logo, desde 196 00:11:20,370 --> 00:11:23,470 refírese ao punto de referencia desde onde está o cursor. 197 00:11:23,470 --> 00:11:26,770 Se pasar en SEEK_CUR, que representa o actual 198 00:11:26,770 --> 00:11:28,100 posición no ficheiro. 199 00:11:28,100 --> 00:11:31,020 Ou pode empregar algúns outros parámetros. 200 00:11:31,020 --> 00:11:35,400 Entón, a xente pode querer usar fseek para saltar sobre o recheo do ficheiro en. 201 00:11:35,400 --> 00:11:39,410 E, de novo, se está preso, non hai un exemplo de que, en copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Entón, agora nós abrimos o arquivo, a pista, eo veredicto. 203 00:11:43,260 --> 00:11:46,450 Nós actualizamos a información da cabeceira para noso veredicto, que cada 204 00:11:46,450 --> 00:11:48,730 bitmap precisa dun cabeceira. 205 00:11:48,730 --> 00:11:52,280 Entón Nós lemos na pista de scanline, pixel a pixel, cambiando 206 00:11:52,280 --> 00:11:55,210 todas as cores que corresponda, e escribindo aqueles no 207 00:11:55,210 --> 00:11:57,340 veredicto, pixel por pixel. 208 00:11:57,340 --> 00:12:01,550 Unha vez que abrir o veredicto, pode ver quen o culpable, ou cal é o segredo 209 00:12:01,550 --> 00:12:02,850 mensaxe. 210 00:12:02,850 --> 00:12:05,550 O meu nome é Zamyla e este era whodunit. 211 00:12:05,550 --> 00:12:12,864