1 00:00:00,000 --> 00:00:09,500 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:09,500 --> 00:00:12,350 >> ZAMYLA CHAN: Fue la señorita Scarlett con el candelabro. 3 00:00:12,350 --> 00:00:13,560 Quién lo hizo? 4 00:00:13,560 --> 00:00:15,030 Bueno, vamos a averiguarlo. 5 00:00:15,030 --> 00:00:20,870 En la pista juego de mesa, es posible darse una imagen roja física. 6 00:00:20,870 --> 00:00:24,120 Y esa imagen es muy roja y irregular, y su trabajo consiste en 7 00:00:24,120 --> 00:00:25,490 revelar el mensaje oculto. 8 00:00:25,490 --> 00:00:29,740 Y por lo general usted está provisto de un rojo lupa, o una pantalla roja de 9 00:00:29,740 --> 00:00:31,410 revelar que mensaje oculto. 10 00:00:31,410 --> 00:00:33,340 Bueno, vamos a imitar eso. 11 00:00:33,340 --> 00:00:37,960 >> En novela policíaca, se le ofrece una imagen de mapa de bits que se ve muy irregular y de color rojo, 12 00:00:37,960 --> 00:00:43,430 a continuación, ejecute el programa de novela policíaca para revelar un mensaje oculto. 13 00:00:43,430 --> 00:00:45,650 >> Así que vamos a romper este en pasos. 14 00:00:45,650 --> 00:00:50,390 En primer lugar, que desea abrir el archivo - la idea de que se te ha dado. 15 00:00:50,390 --> 00:00:53,880 Y entonces también crear un archivo de mapa de bits veredicto. 16 00:00:53,880 --> 00:00:58,240 Entonces usted desea actualizar el mapa de bits header info para el archivo de salida veredicto. 17 00:00:58,240 --> 00:00:59,920 Más sobre esto más adelante. 18 00:00:59,920 --> 00:01:04,319 Y luego vas a leer en el pista, línea de exploración, píxel por píxel, 19 00:01:04,319 --> 00:01:07,320 el cambio de los colores de los píxeles como necesario, y la escritura 20 00:01:07,320 --> 00:01:08,960 aquellos en los que el veredicto - 21 00:01:08,960 --> 00:01:12,000 píxel por píxel en el scanline veredicto. 22 00:01:12,000 --> 00:01:13,780 >> ¿Cómo empezamos ir sobre esto? 23 00:01:13,780 --> 00:01:16,940 Bueno, por suerte, tenemos copy.c en el código de distribución. 24 00:01:16,940 --> 00:01:21,240 Y esto va a demostrar muy útil para nosotros. 25 00:01:21,240 --> 00:01:29,700 Copy.c abre un archivo, lee en ese un cabezazo de infile y, a continuación, actualiza el 26 00:01:29,700 --> 00:01:31,070 cabecera del archivo de salida. 27 00:01:31,070 --> 00:01:37,010 Y a continuación, se lee cada píxel en el scanline, pixel por pixel, y luego 28 00:01:37,010 --> 00:01:42,390 escribe que pixel en el archivo de salida. 29 00:01:42,390 --> 00:01:45,020 >> Así, el primer paso podría la de ejecutar el siguiente 30 00:01:45,020 --> 00:01:46,420 comando en 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 Esto creará una copia de copy.c llamado whodunit.c. 33 00:01:55,320 --> 00:01:58,320 Así que nuestro primer paso para abrir la archivo, así, hay una exacta 34 00:01:58,320 --> 00:02:00,070 réplica de que en copy.c. 35 00:02:00,070 --> 00:02:03,360 Así que te voy a dejar de ver eso. 36 00:02:03,360 --> 00:02:07,860 >> Lo que estamos tratando en este PSET es / S de archivos, teniendo básicamente archivos, 37 00:02:07,860 --> 00:02:10,229 la lectura, la escritura, la edición de ellos. 38 00:02:10,229 --> 00:02:12,650 ¿Cómo se abre por primera vez un archivo? 39 00:02:12,650 --> 00:02:16,800 Bueno, vas a declarar un archivo puntero, y luego se llama a la 40 00:02:16,800 --> 00:02:18,670 fopen función. 41 00:02:18,670 --> 00:02:23,150 Pase en el camino, o el nombre de esa archivo, y luego el modo que desea 42 00:02:23,150 --> 00:02:24,700 para abrir ese archivo pulg 43 00:02:24,700 --> 00:02:28,620 Pasando en un r abrirá foo.bmp para la lectura. 44 00:02:28,620 --> 00:02:35,670 Mientras fopen con el paso de una w se bar.bmp abierto, para escribir el archivo y 45 00:02:35,670 --> 00:02:37,020 realidad editarlo. 46 00:02:37,020 --> 00:02:41,970 >> Así que ahora que hemos abierto el archivo, nuestra siguiente paso es actualizar la información de la cabecera 47 00:02:41,970 --> 00:02:43,230 para el archivo de salida. 48 00:02:43,230 --> 00:02:44,610 ¿Qué es un jefe Info? 49 00:02:44,610 --> 00:02:48,160 Bueno, primero tenemos que saber lo que es un mapa de bits es. 50 00:02:48,160 --> 00:02:51,000 Un mapa de bits es un simple arreglo de octetos. 51 00:02:51,000 --> 00:02:55,480 Y están declarados en el archivo aquí, bmp.h, con un grupo de 52 00:02:55,480 --> 00:02:58,610 la información de lo que es un mapa de bits se hace realidad fuera de. 53 00:02:58,610 --> 00:03:05,730 Pero lo que realmente nos importa es la encabezado del archivo de mapa de bits, aquí mismo, y 54 00:03:05,730 --> 00:03:08,460 la cabecera de información de mapa de bits, por aquí. 55 00:03:08,460 --> 00:03:13,170 La cabecera está compuesta por un par de variables que van a resultar muy útil. 56 00:03:13,170 --> 00:03:18,400 Hay biSizeImage, que es el El tamaño total de la imagen en bytes. 57 00:03:18,400 --> 00:03:20,890 Y esto incluye a los píxeles y relleno. 58 00:03:20,890 --> 00:03:24,210 El relleno es muy importante, pero vamos a llegar a eso más adelante. 59 00:03:24,210 --> 00:03:30,000 >> BiWidth representa la anchura de la imagen en píxeles, menos el relleno. 60 00:03:30,000 --> 00:03:34,220 BiHeight es entonces también la altura de la imagen en píxeles. 61 00:03:34,220 --> 00:03:38,240 Y entonces el BITMAPFILEHEADER y el BITMAPINFOHEADER, como he mencionado 62 00:03:38,240 --> 00:03:40,900 antes, los están representados como estructuras. 63 00:03:40,900 --> 00:03:45,410 Así, no se puede acceder a la cabecera del archivo en sí, sino que querrá llegar a 64 00:03:45,410 --> 00:03:47,370 esas variables en el interior. 65 00:03:47,370 --> 00:03:48,170 >> Aceptar. 66 00:03:48,170 --> 00:03:50,600 Entonces, ¿cómo nos ponemos al día la información de la cabecera? 67 00:03:50,600 --> 00:03:54,020 Bueno, primero tenemos que ver si nos necesitará cambiar cualquier información de 68 00:03:54,020 --> 00:03:58,480 el infile, la pista, a la archivosalida, el veredicto. 69 00:03:58,480 --> 00:04:00,250 ¿Hay algo que cambia en este caso? 70 00:04:00,250 --> 00:04:04,320 Bueno, en realidad no, porque vamos que se acaba de cambiar los colores. 71 00:04:04,320 --> 00:04:07,550 No vamos a estar cambiando el archivo tamaño, el tamaño de la imagen, la anchura, 72 00:04:07,550 --> 00:04:08,310 o la altura. 73 00:04:08,310 --> 00:04:14,010 Así que estás bien por el momento por simplemente copiando cada píxel. 74 00:04:14,010 --> 00:04:14,840 >> Aceptar. 75 00:04:14,840 --> 00:04:20,720 Así que ahora vamos a ver cómo podemos realmente puede leer cada píxel del archivo. 76 00:04:20,720 --> 00:04:23,640 Otro archivo de función de E / S entrará en juego - 77 00:04:23,640 --> 00:04:24,700 fread. 78 00:04:24,700 --> 00:04:28,440 Se necesita en un puntero a la estructura que contendrá los bytes que 79 00:04:28,440 --> 00:04:30,110 que usted está leyendo. 80 00:04:30,110 --> 00:04:31,890 Así que usted está leyendo en eso. 81 00:04:31,890 --> 00:04:36,090 Y luego se pasa en un tamaño, que es el tamaño de cada elemento que 82 00:04:36,090 --> 00:04:37,360 querer leer. 83 00:04:37,360 --> 00:04:40,640 Aquí, la función sizeof será muy útil. 84 00:04:40,640 --> 00:04:45,570 Luego se pasa en número, que representa el número de elementos de 85 00:04:45,570 --> 00:04:47,480 tamaño de leer. 86 00:04:47,480 --> 00:04:51,180 Y, finalmente, inptr, que es el puntero del archivo que estás 87 00:04:51,180 --> 00:04:52,530 va a leer. 88 00:04:52,530 --> 00:04:58,650 Así que todos esos elementos se encuentran dentro inptr y van a los datos. 89 00:04:58,650 --> 00:05:01,660 >> Veamos un pequeño ejemplo. 90 00:05:01,660 --> 00:05:07,590 Si quiero leer en los datos de dos perros, bueno, no puedo hacerlo de dos maneras. 91 00:05:07,590 --> 00:05:15,250 Soy capaz de leer bien en dos objetos de tamaño perro de mi inptr, o puedo leer 92 00:05:15,250 --> 00:05:19,280 en un objeto del tamaño de dos perros. 93 00:05:19,280 --> 00:05:23,580 Así que ya ves que dependiendo de la forma que usted disponga tamaño y número, 94 00:05:23,580 --> 00:05:25,840 puede leer en el mismo número de bytes. 95 00:05:25,840 --> 00:05:28,720 96 00:05:28,720 --> 00:05:33,020 >> Así que ahora, vamos a cambiar el color del pixel ya que necesitamos. 97 00:05:33,020 --> 00:05:37,320 Si nos fijamos en bmp.h nuevo, entonces verás que en la parte inferior 98 00:05:37,320 --> 00:05:42,920 RGBTRIPLEs son otra estructura, donde que se componen de tres bytes. 99 00:05:42,920 --> 00:05:49,220 Uno, rgbtBlue, rgbtGreen, y rgbtRed. 100 00:05:49,220 --> 00:05:52,480 Así que cada uno de ellos representa la cantidad de azul, la cantidad de verde, y el 101 00:05:52,480 --> 00:05:57,250 cantidad de rojo en el interior de este píxel, donde cada cantidad está representada por una 102 00:05:57,250 --> 00:05:58,670 número hexadecimal. 103 00:05:58,670 --> 00:06:04,370 >> Así ff0000 serán de un color azul, ya que va desde el azul, 104 00:06:04,370 --> 00:06:05,850 al verde, al rojo. 105 00:06:05,850 --> 00:06:09,300 Y entonces todos los f de será blanco. 106 00:06:09,300 --> 00:06:13,440 Echemos un vistazo a smiley.bmp, que que tiene en su código de distribución. 107 00:06:13,440 --> 00:06:15,690 Si lo abre en tan sólo una imagen espectador, entonces te 108 00:06:15,690 --> 00:06:17,080 sólo ver un smiley rojo. 109 00:06:17,080 --> 00:06:20,380 Pero tomar una inmersión más profunda en, vamos a ver que la estructura 110 00:06:20,380 --> 00:06:22,340 de él son sólo píxeles. 111 00:06:22,340 --> 00:06:25,880 Tenemos píxeles blancos, y luego píxeles rojos. 112 00:06:25,880 --> 00:06:31,000 El ffffff blanco, y luego, de la píxeles rojos que he coloreado por usted 113 00:06:31,000 --> 00:06:35,440 aquí, y ves que son 0000ff. 114 00:06:35,440 --> 00:06:39,760 Zero azul, verde a cero, y lleno de color rojo. 115 00:06:39,760 --> 00:06:45,350 Y puesto que es sonriente ocho píxeles de ancho, no tenemos ningún relleno. 116 00:06:45,350 --> 00:06:47,360 Está bien. 117 00:06:47,360 --> 00:06:53,310 >> Así que si yo fuera a asignar diferentes valores a un RGBTRIPLE y quería 118 00:06:53,310 --> 00:06:58,350 que sea verde, entonces lo que yo haría es Me gustaría declarar un RGBTRIPLE, llamado 119 00:06:58,350 --> 00:07:02,660 triple, y luego para acceder a todos los byte dentro de esa estructura lo 120 00:07:02,660 --> 00:07:04,030 sería utilizar el operador punto. 121 00:07:04,030 --> 00:07:08,430 Así triple.rgbtBlue, puedo asignar dicho a 0. 122 00:07:08,430 --> 00:07:13,460 Verde puedo asignarlo a full - cualquier número, en realidad, entre 0 y ss. 123 00:07:13,460 --> 00:07:15,470 Y luego rojo, yo también voy a decir 0. 124 00:07:15,470 --> 00:07:19,160 Así que eso me da un pixel verde. 125 00:07:19,160 --> 00:07:23,030 >> A continuación, ¿qué pasa si quiero comprobar el valor de algo? 126 00:07:23,030 --> 00:07:27,250 Podría tener algo que comprueba si el valor de la triple rgbtBlue es 127 00:07:27,250 --> 00:07:31,080 ff y luego la impresión, "Me siento azul! ", como resultado. 128 00:07:31,080 --> 00:07:35,640 Ahora, eso no significa necesariamente que el píxel es azul, ¿verdad? 129 00:07:35,640 --> 00:07:40,060 Debido a que los valores de verde y rojo del píxel También podría tener no 0 valores. 130 00:07:40,060 --> 00:07:43,470 Todo lo que esto significa, y todo lo que esta es la comprobación de que es 131 00:07:43,470 --> 00:07:45,610 de un color azul lleno. 132 00:07:45,610 --> 00:07:50,050 Pero todos los píxeles podrían tener también parcial valores de color, como este 133 00:07:50,050 --> 00:07:52,180 siguiente ejemplo aquí. 134 00:07:52,180 --> 00:07:55,400 >> Es un poco más difícil de ver lo que esta imagen es ahora. 135 00:07:55,400 --> 00:08:00,320 Esto parece un poco más a la clue.bmp que se le dará. 136 00:08:00,320 --> 00:08:03,600 Ahora, físicamente, es posible solucionar esto, porque hay una gran cantidad de rojo, por 137 00:08:03,600 --> 00:08:07,040 que soporta una pantalla roja de la imagen de forma que pueden aparecer los otros colores. 138 00:08:07,040 --> 00:08:10,968 Entonces, ¿cómo imitar este con c? 139 00:08:10,968 --> 00:08:15,640 Bueno, es posible que quitemos todo rojo de la imagen en su totalidad. 140 00:08:15,640 --> 00:08:21,870 Y así, para hacer que nos lo pusimos en cada valor del rojo del pixel a 0. 141 00:08:21,870 --> 00:08:25,020 Y lo que la imagen se vería un poco poco como este, donde no tenemos rojo 142 00:08:25,020 --> 00:08:26,300 de ningún tipo. 143 00:08:26,300 --> 00:08:29,390 >> Podemos ver el mensaje oculto un poco más de claridad. 144 00:08:29,390 --> 00:08:31,730 Es otra cara sonriente. 145 00:08:31,730 --> 00:08:33,870 O tal vez podríamos utilizar otro método. 146 00:08:33,870 --> 00:08:36,480 Tal vez, podríamos identificar todos los píxeles de color rojo - 147 00:08:36,480 --> 00:08:41,100 es decir, todos los píxeles con 0 azul, verde 0, y 0 en rojo - 148 00:08:41,100 --> 00:08:43,169 y cambiar los a blanco. 149 00:08:43,169 --> 00:08:45,470 Y nuestra imagen puede tener un aspecto algo como esto. 150 00:08:45,470 --> 00:08:48,250 Un poco más fácil de ver. 151 00:08:48,250 --> 00:08:51,170 >> Hay un montón de otras maneras de descubrir el mensaje secreto, así, 152 00:08:51,170 --> 00:08:53,730 tratar con la manipulación del color. 153 00:08:53,730 --> 00:08:57,050 Tal vez usted podría usar uno de los métodos que he mencionado anteriormente. 154 00:08:57,050 --> 00:08:59,600 Y, además, es posible que desee para mejorar algunos colores 155 00:08:59,600 --> 00:09:02,620 y llevar a cabo los. 156 00:09:02,620 --> 00:09:06,190 >> Así que ahora que hemos cambiado el píxel color, al lado sólo tenemos que escribirlas 157 00:09:06,190 --> 00:09:08,500 en la línea de exploración, pixel por pixel. 158 00:09:08,500 --> 00:09:11,860 Y una vez más, tendrá que mirar hacia atrás a copy.c, si no ha copiado 159 00:09:11,860 --> 00:09:18,170 ya, y mira el fwrite función, que toma los datos, un puntero 160 00:09:18,170 --> 00:09:23,230 a la estructura que contiene los bytes que usted está leyendo, el tamaño de 161 00:09:23,230 --> 00:09:26,610 los artículos, el número de elementos, y luego el outptr - 162 00:09:26,610 --> 00:09:29,450 el destino de esos archivos. 163 00:09:29,450 --> 00:09:34,010 >> Después de escribir en los píxeles, se le También tiene que escribir en el relleno. 164 00:09:34,010 --> 00:09:34,970 ¿Qué es el relleno? 165 00:09:34,970 --> 00:09:38,670 Bueno, cada pixel rgbt es de tres bytes de longitud. 166 00:09:38,670 --> 00:09:43,670 Pero, la línea de exploración de imagen de mapa de bits para tiene que ser un múltiplo de cuatro bytes. 167 00:09:43,670 --> 00:09:47,650 Y si el número de píxeles no es un múltiplo de cuatro, entonces tenemos que añadir 168 00:09:47,650 --> 00:09:48,880 este relleno. 169 00:09:48,880 --> 00:09:51,420 El relleno se acaba representado por 0s. 170 00:09:51,420 --> 00:09:54,380 Entonces, ¿cómo se escribe o lee esto? 171 00:09:54,380 --> 00:09:59,280 Bueno, resulta que no se puede padding realidad fread, pero se puede 172 00:09:59,280 --> 00:10:00,970 calcularlo. 173 00:10:00,970 --> 00:10:04,400 >> En este caso, la clave y el veredicto tienen la misma anchura, por lo que el 174 00:10:04,400 --> 00:10:05,910 relleno es el mismo. 175 00:10:05,910 --> 00:10:09,370 Y el relleno, ya verás en copy.c, se calcula 176 00:10:09,370 --> 00:10:11,790 con la siguiente fórmula - 177 00:10:11,790 --> 00:10:16,690 veces bi.biWidth sizeof (RGBTRIPLE) se darnos el número de bytes que el bmp 178 00:10:16,690 --> 00:10:18,280 tiene en cada fila. 179 00:10:18,280 --> 00:10:21,890 Desde allí, los modulos y restas con 4 puede calcular la 180 00:10:21,890 --> 00:10:25,610 hay que añadir la cantidad de bytes para que el múltiplo de bytes en 181 00:10:25,610 --> 00:10:27,250 cada fila es de cuatro. 182 00:10:27,250 --> 00:10:30,490 >> Ahora que ya tenemos la fórmula para el relleno que necesitamos, ahora 183 00:10:30,490 --> 00:10:31,610 podemos escribirlo. 184 00:10:31,610 --> 00:10:34,080 Ahora, que he mencionado antes, relleno es sólo 0s. 185 00:10:34,080 --> 00:10:39,730 Así que en ese caso, sólo estamos poniendo un char, en este caso un 0, en nuestra 186 00:10:39,730 --> 00:10:41,710 outptr - nuestro archivo de salida. 187 00:10:41,710 --> 00:10:47,530 Así que puede ser sólo fputc 0, coma outptr. 188 00:10:47,530 --> 00:10:52,400 >> Así, mientras que hemos estado leyendo en nuestra archivo archivo de E / S se ha mantenido un seguimiento de nuestra 189 00:10:52,400 --> 00:10:57,440 posición en los archivos con algo llamado el indicador de posición del fichero. 190 00:10:57,440 --> 00:10:59,350 Piense en ello como un cursor. 191 00:10:59,350 --> 00:11:03,550 Básicamente, se avanza cada vez que fread, pero tenemos 192 00:11:03,550 --> 00:11:05,671 el control sobre él, también. 193 00:11:05,671 --> 00:11:11,030 >> Para mover el indicador de posición del fichero, puede utilizar la función fseek. 194 00:11:11,030 --> 00:11:15,600 Cuando el inptr representa el archivo puntero que usted está buscando en el 195 00:11:15,600 --> 00:11:20,370 cantidad es el número de bytes que se desee mover el cursor, y luego de 196 00:11:20,370 --> 00:11:23,470 se refiere al punto de referencia de donde se encuentra el cursor. 197 00:11:23,470 --> 00:11:26,770 Si pasa en SEEK_CUR, que representa la corriente 198 00:11:26,770 --> 00:11:28,100 posición en el archivo. 199 00:11:28,100 --> 00:11:31,020 O usted puede utilizar algunos otros parámetros. 200 00:11:31,020 --> 00:11:35,400 Por lo tanto, lo que se quiere utilizar fseek saltarse sobre el acolchado del archivo en formato. 201 00:11:35,400 --> 00:11:39,410 Y de nuevo, si estás atascado, hay un ejemplo de ello en copy.c. 202 00:11:39,410 --> 00:11:43,260 >> Así que ahora que hemos abierto el archivo, la pista, y el veredicto. 203 00:11:43,260 --> 00:11:46,450 Hemos actualizado la información de la cabecera de nuestro veredicto, porque cada 204 00:11:46,450 --> 00:11:48,730 mapa de bits necesita un cabezazo. 205 00:11:48,730 --> 00:11:52,280 A continuación, hemos leído en la pista de scanline, píxel por píxel, el cambio de 206 00:11:52,280 --> 00:11:55,210 cada color, según sea necesario, y escribir los en el 207 00:11:55,210 --> 00:11:57,340 veredicto, píxel por píxel. 208 00:11:57,340 --> 00:12:01,550 Una vez que abra el veredicto, se puede ver que el culpable, o cuál es el secreto 209 00:12:01,550 --> 00:12:02,850 mensaje es. 210 00:12:02,850 --> 00:12:05,550 Mi nombre es Zamyla y esto fue quién lo hizo. 211 00:12:05,550 --> 00:12:12,864