[REPRODUCCIÓN DE MÚSICA] ZAMYLA CHAN: Fue la señorita Scarlett con el candelabro. Quién lo hizo? Bueno, vamos a averiguarlo. En la pista juego de mesa, es posible darse una imagen roja física. Y esa imagen es muy roja y irregular, y su trabajo consiste en revelar el mensaje oculto. Y por lo general usted está provisto de un rojo lupa, o una pantalla roja de revelar que mensaje oculto. Bueno, vamos a imitar eso. En novela policíaca, se le ofrece una imagen de mapa de bits que se ve muy irregular y de color rojo, a continuación, ejecute el programa de novela policíaca para revelar un mensaje oculto. Así que vamos a romper este en pasos. En primer lugar, que desea abrir el archivo - la idea de que se te ha dado. Y entonces también crear un archivo de mapa de bits veredicto. Entonces usted desea actualizar el mapa de bits header info para el archivo de salida veredicto. Más sobre esto más adelante. Y luego vas a leer en el pista, línea de exploración, píxel por píxel, el cambio de los colores de los píxeles como necesario, y la escritura aquellos en los que el veredicto - píxel por píxel en el scanline veredicto. ¿Cómo empezamos ir sobre esto? Bueno, por suerte, tenemos copy.c en el código de distribución. Y esto va a demostrar muy útil para nosotros. Copy.c abre un archivo, lee en ese un cabezazo de infile y, a continuación, actualiza el cabecera del archivo de salida. Y a continuación, se lee cada píxel en el scanline, pixel por pixel, y luego escribe que pixel en el archivo de salida. Así, el primer paso podría la de ejecutar el siguiente comando en la terminal - cp copy.c whodunit.c. Esto creará una copia de copy.c llamado whodunit.c. Así que nuestro primer paso para abrir la archivo, así, hay una exacta réplica de que en copy.c. Así que te voy a dejar de ver eso. Lo que estamos tratando en este PSET es / S de archivos, teniendo básicamente archivos, la lectura, la escritura, la edición de ellos. ¿Cómo se abre por primera vez un archivo? Bueno, vas a declarar un archivo puntero, y luego se llama a la fopen función. Pase en el camino, o el nombre de esa archivo, y luego el modo que desea para abrir ese archivo pulg Pasando en un r abrirá foo.bmp para la lectura. Mientras fopen con el paso de una w se bar.bmp abierto, para escribir el archivo y realidad editarlo. Así que ahora que hemos abierto el archivo, nuestra siguiente paso es actualizar la información de la cabecera para el archivo de salida. ¿Qué es un jefe Info? Bueno, primero tenemos que saber lo que es un mapa de bits es. Un mapa de bits es un simple arreglo de octetos. Y están declarados en el archivo aquí, bmp.h, con un grupo de la información de lo que es un mapa de bits se hace realidad fuera de. Pero lo que realmente nos importa es la encabezado del archivo de mapa de bits, aquí mismo, y la cabecera de información de mapa de bits, por aquí. La cabecera está compuesta por un par de variables que van a resultar muy útil. Hay biSizeImage, que es el El tamaño total de la imagen en bytes. Y esto incluye a los píxeles y relleno. El relleno es muy importante, pero vamos a llegar a eso más adelante. BiWidth representa la anchura de la imagen en píxeles, menos el relleno. BiHeight es entonces también la altura de la imagen en píxeles. Y entonces el BITMAPFILEHEADER y el BITMAPINFOHEADER, como he mencionado antes, los están representados como estructuras. Así, no se puede acceder a la cabecera del archivo en sí, sino que querrá llegar a esas variables en el interior. Aceptar. Entonces, ¿cómo nos ponemos al día la información de la cabecera? Bueno, primero tenemos que ver si nos necesitará cambiar cualquier información de el infile, la pista, a la archivosalida, el veredicto. ¿Hay algo que cambia en este caso? Bueno, en realidad no, porque vamos que se acaba de cambiar los colores. No vamos a estar cambiando el archivo tamaño, el tamaño de la imagen, la anchura, o la altura. Así que estás bien por el momento por simplemente copiando cada píxel. Aceptar. Así que ahora vamos a ver cómo podemos realmente puede leer cada píxel del archivo. Otro archivo de función de E / S entrará en juego - fread. Se necesita en un puntero a la estructura que contendrá los bytes que que usted está leyendo. Así que usted está leyendo en eso. Y luego se pasa en un tamaño, que es el tamaño de cada elemento que querer leer. Aquí, la función sizeof será muy útil. Luego se pasa en número, que representa el número de elementos de tamaño de leer. Y, finalmente, inptr, que es el puntero del archivo que estás va a leer. Así que todos esos elementos se encuentran dentro inptr y van a los datos. Veamos un pequeño ejemplo. Si quiero leer en los datos de dos perros, bueno, no puedo hacerlo de dos maneras. Soy capaz de leer bien en dos objetos de tamaño perro de mi inptr, o puedo leer en un objeto del tamaño de dos perros. Así que ya ves que dependiendo de la forma que usted disponga tamaño y número, puede leer en el mismo número de bytes. Así que ahora, vamos a cambiar el color del pixel ya que necesitamos. Si nos fijamos en bmp.h nuevo, entonces verás que en la parte inferior RGBTRIPLEs son otra estructura, donde que se componen de tres bytes. Uno, rgbtBlue, rgbtGreen, y rgbtRed. Así que cada uno de ellos representa la cantidad de azul, la cantidad de verde, y el cantidad de rojo en el interior de este píxel, donde cada cantidad está representada por una número hexadecimal. Así ff0000 serán de un color azul, ya que va desde el azul, al verde, al rojo. Y entonces todos los f de será blanco. Echemos un vistazo a smiley.bmp, que que tiene en su código de distribución. Si lo abre en tan sólo una imagen espectador, entonces te sólo ver un smiley rojo. Pero tomar una inmersión más profunda en, vamos a ver que la estructura de él son sólo píxeles. Tenemos píxeles blancos, y luego píxeles rojos. El ffffff blanco, y luego, de la píxeles rojos que he coloreado por usted aquí, y ves que son 0000ff. Zero azul, verde a cero, y lleno de color rojo. Y puesto que es sonriente ocho píxeles de ancho, no tenemos ningún relleno. Está bien. Así que si yo fuera a asignar diferentes valores a un RGBTRIPLE y quería que sea verde, entonces lo que yo haría es Me gustaría declarar un RGBTRIPLE, llamado triple, y luego para acceder a todos los byte dentro de esa estructura lo sería utilizar el operador punto. Así triple.rgbtBlue, puedo asignar dicho a 0. Verde puedo asignarlo a full - cualquier número, en realidad, entre 0 y ss. Y luego rojo, yo también voy a decir 0. Así que eso me da un pixel verde. A continuación, ¿qué pasa si quiero comprobar el valor de algo? Podría tener algo que comprueba si el valor de la triple rgbtBlue es ff y luego la impresión, "Me siento azul! ", como resultado. Ahora, eso no significa necesariamente que el píxel es azul, ¿verdad? Debido a que los valores de verde y rojo del píxel También podría tener no 0 valores. Todo lo que esto significa, y todo lo que esta es la comprobación de que es de un color azul lleno. Pero todos los píxeles podrían tener también parcial valores de color, como este siguiente ejemplo aquí. Es un poco más difícil de ver lo que esta imagen es ahora. Esto parece un poco más a la clue.bmp que se le dará. Ahora, físicamente, es posible solucionar esto, porque hay una gran cantidad de rojo, por que soporta una pantalla roja de la imagen de forma que pueden aparecer los otros colores. Entonces, ¿cómo imitar este con c? Bueno, es posible que quitemos todo rojo de la imagen en su totalidad. Y así, para hacer que nos lo pusimos en cada valor del rojo del pixel a 0. Y lo que la imagen se vería un poco poco como este, donde no tenemos rojo de ningún tipo. Podemos ver el mensaje oculto un poco más de claridad. Es otra cara sonriente. O tal vez podríamos utilizar otro método. Tal vez, podríamos identificar todos los píxeles de color rojo - es decir, todos los píxeles con 0 azul, verde 0, y 0 en rojo - y cambiar los a blanco. Y nuestra imagen puede tener un aspecto algo como esto. Un poco más fácil de ver. Hay un montón de otras maneras de descubrir el mensaje secreto, así, tratar con la manipulación del color. Tal vez usted podría usar uno de los métodos que he mencionado anteriormente. Y, además, es posible que desee para mejorar algunos colores y llevar a cabo los. Así que ahora que hemos cambiado el píxel color, al lado sólo tenemos que escribirlas en la línea de exploración, pixel por pixel. Y una vez más, tendrá que mirar hacia atrás a copy.c, si no ha copiado ya, y mira el fwrite función, que toma los datos, un puntero a la estructura que contiene los bytes que usted está leyendo, el tamaño de los artículos, el número de elementos, y luego el outptr - el destino de esos archivos. Después de escribir en los píxeles, se le También tiene que escribir en el relleno. ¿Qué es el relleno? Bueno, cada pixel rgbt es de tres bytes de longitud. Pero, la línea de exploración de imagen de mapa de bits para tiene que ser un múltiplo de cuatro bytes. Y si el número de píxeles no es un múltiplo de cuatro, entonces tenemos que añadir este relleno. El relleno se acaba representado por 0s. Entonces, ¿cómo se escribe o lee esto? Bueno, resulta que no se puede padding realidad fread, pero se puede calcularlo. En este caso, la clave y el veredicto tienen la misma anchura, por lo que el relleno es el mismo. Y el relleno, ya verás en copy.c, se calcula con la siguiente fórmula - veces bi.biWidth sizeof (RGBTRIPLE) se darnos el número de bytes que el bmp tiene en cada fila. Desde allí, los modulos y restas con 4 puede calcular la hay que añadir la cantidad de bytes para que el múltiplo de bytes en cada fila es de cuatro. Ahora que ya tenemos la fórmula para el relleno que necesitamos, ahora podemos escribirlo. Ahora, que he mencionado antes, relleno es sólo 0s. Así que en ese caso, sólo estamos poniendo un char, en este caso un 0, en nuestra outptr - nuestro archivo de salida. Así que puede ser sólo fputc 0, coma outptr. Así, mientras que hemos estado leyendo en nuestra archivo archivo de E / S se ha mantenido un seguimiento de nuestra posición en los archivos con algo llamado el indicador de posición del fichero. Piense en ello como un cursor. Básicamente, se avanza cada vez que fread, pero tenemos el control sobre él, también. Para mover el indicador de posición del fichero, puede utilizar la función fseek. Cuando el inptr representa el archivo puntero que usted está buscando en el cantidad es el número de bytes que se desee mover el cursor, y luego de se refiere al punto de referencia de donde se encuentra el cursor. Si pasa en SEEK_CUR, que representa la corriente posición en el archivo. O usted puede utilizar algunos otros parámetros. Por lo tanto, lo que se quiere utilizar fseek saltarse sobre el acolchado del archivo en formato. Y de nuevo, si estás atascado, hay un ejemplo de ello en copy.c. Así que ahora que hemos abierto el archivo, la pista, y el veredicto. Hemos actualizado la información de la cabecera de nuestro veredicto, porque cada mapa de bits necesita un cabezazo. A continuación, hemos leído en la pista de scanline, píxel por píxel, el cambio de cada color, según sea necesario, y escribir los en el veredicto, píxel por píxel. Una vez que abra el veredicto, se puede ver que el culpable, o cuál es el secreto mensaje es. Mi nombre es Zamyla y esto fue quién lo hizo.