1 00:00:00,000 --> 00:00:10,210 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: golpe nos dejó las cosas con cambio de tamaño. 3 00:00:13,320 --> 00:00:17,710 En cambio de tamaño, el usuario pasará en, a través de la línea de comandos, una imagen de mapa de bits que 4 00:00:17,710 --> 00:00:21,860 que quieren escalar por un número que también pasan en, 5 00:00:21,860 --> 00:00:23,770 en la línea de comandos. 6 00:00:23,770 --> 00:00:24,690 ¿Cómo hacemos esto? 7 00:00:24,690 --> 00:00:28,270 >> Bueno, primero lo primero, vamos a descomponerlo en pasos. 8 00:00:28,270 --> 00:00:31,510 Usted va a querer abrir el archivo de entrada que te dan, así como 9 00:00:31,510 --> 00:00:35,560 crear y abrir el archivo de salida que usted va a poner el 10 00:00:35,560 --> 00:00:38,020 imagen redimensionada pulg 11 00:00:38,020 --> 00:00:42,050 Entonces, debido a que está el cambio de tamaño, y porque es un mapa de bits, es un encabezado, por lo 12 00:00:42,050 --> 00:00:46,080 usted va a actualizar también la cabecera información para el archivo de salida, 13 00:00:46,080 --> 00:00:47,950 y escribir que pulg 14 00:00:47,950 --> 00:00:51,850 Entonces, vas a leer en la línea de exploración del archivo de entrada, 15 00:00:51,850 --> 00:00:56,890 pixel por pixel, cambiar el tamaño horizontal y escribir los píxeles en la 16 00:00:56,890 --> 00:01:00,910 archivosalida, tal como se especifica por la escala del usuario. 17 00:01:00,910 --> 00:01:03,940 >> Vas a recordar a agregar relleno según sea necesario. 18 00:01:03,940 --> 00:01:05,400 Más sobre esto más adelante. 19 00:01:05,400 --> 00:01:07,790 Y luego, también cambiar el tamaño vertical. 20 00:01:07,790 --> 00:01:08,890 Aceptar. 21 00:01:08,890 --> 00:01:13,280 Así que esto va a ser un poco más complicado que quién lo hizo, pero 22 00:01:13,280 --> 00:01:18,310 lo que es similar es el copy.c voluntad, otra vez, resultar muy útil. 23 00:01:18,310 --> 00:01:23,160 Recuerde que copy.c abre un archivo, actualiza la información del encabezado para el 24 00:01:23,160 --> 00:01:28,250 archivosalida, luego lee en la línea de exploración, píxel por píxel, escribiendo cada píxel 25 00:01:28,250 --> 00:01:30,510 en línea de exploración del archivo de salida. 26 00:01:30,510 --> 00:01:37,040 >> Así que de nuevo, el primer paso podría probablemente la de cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 en su directorio PSET5. 28 00:01:40,560 --> 00:01:43,920 Recuerde, sin embargo, antes de copiarlo, para asegurarse de que usted entiende 29 00:01:43,920 --> 00:01:46,600 copy.c muy a fondo. 30 00:01:46,600 --> 00:01:47,620 Aceptar. 31 00:01:47,620 --> 00:01:49,880 >> Así que vamos a abrir un archivo. 32 00:01:49,880 --> 00:01:50,870 Ya sabes cómo hacer eso. 33 00:01:50,870 --> 00:01:52,600 Voy a dejar eso a usted. 34 00:01:52,600 --> 00:01:56,050 A continuación, actualizar la información de la cabecera para el archivo de salida. 35 00:01:56,050 --> 00:01:59,240 Debido a que tenemos un nuevo mapa de bits, tenemos nueva información de la cabecera. 36 00:01:59,240 --> 00:02:00,970 ¿Qué está cambiando en esta lista? 37 00:02:00,970 --> 00:02:06,000 Pues bien, el tamaño de archivo se va a cambiar porque vamos a tener más 38 00:02:06,000 --> 00:02:07,900 píxeles que antes. 39 00:02:07,900 --> 00:02:11,060 El tamaño de la imagen es, por lo tanto, también va a cambiar, como es el 40 00:02:11,060 --> 00:02:13,050 anchura y la altura. 41 00:02:13,050 --> 00:02:17,180 >> Así que las variables son aquellos, exactamente? 42 00:02:17,180 --> 00:02:20,960 Bueno, si nos fijamos en la cabecera información, se ve que hay 43 00:02:20,960 --> 00:02:25,640 biSizeImage, que representa el total tamaño de la imagen en bytes, 44 00:02:25,640 --> 00:02:28,340 incluyendo píxeles y relleno. 45 00:02:28,340 --> 00:02:32,520 biWidth es el ancho de la imagen en píxeles, menos el relleno. 46 00:02:32,520 --> 00:02:35,580 biHeight es la altura de la imagen en píxeles. 47 00:02:35,580 --> 00:02:39,200 Y por lo que aquellos están contenidos en el estructuras BITMAPFILEHEADER y 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Se puede decir cuál es cuál por va a bmp.h y mirando a la 50 00:02:45,300 --> 00:02:49,670 Struct BITMAPINFOHEADER y visión que se incluyen de variables. 51 00:02:49,670 --> 00:02:54,700 >> Así que para actualizar la cabecera outfiles información, usted va a querer 52 00:02:54,700 --> 00:02:57,025 cambiar los valores de la la altura y el ancho. 53 00:02:57,025 --> 00:03:00,570 Pero es probable que, es posible que tenga alguna de la información de encabezado del archivo de entrada 54 00:03:00,570 --> 00:03:03,670 más tarde, así que es mejor no perder de vista a la vez. 55 00:03:03,670 --> 00:03:07,770 Pero ser muy claro con la variable nombres, así que no accidentalmente 56 00:03:07,770 --> 00:03:12,490 escribir los valores incorrectos en el encabezado del archivo de salida. 57 00:03:12,490 --> 00:03:16,160 >> Así que ahora vamos a llegar a la lectura en el píxel por píxel línea de exploración. 58 00:03:16,160 --> 00:03:20,210 Una vez más, vamos a pasar a nuestro fiel presentar biblioteca E / S, y mirar 59 00:03:20,210 --> 00:03:22,100 la función fread. 60 00:03:22,100 --> 00:03:26,150 fread toma en un puntero a una estructura que contendrá los bytes que 61 00:03:26,150 --> 00:03:30,130 usted está leyendo en el tamaño de cada elemento que está leyendo - 62 00:03:30,130 --> 00:03:34,410 de nuevo, sizeof va a ser útil funcionar aquí, el número de la 63 00:03:34,410 --> 00:03:38,820 elementos de tamaño, el tamaño, que usted es la lectura y, a continuación, por último, la 64 00:03:38,820 --> 00:03:41,310 inpointer, el archivo que usted está leyendo. 65 00:03:41,310 --> 00:03:46,770 Así que usted está tomando elementos numéricos de tamaño desde inpointer, y 66 00:03:46,770 --> 00:03:49,040 puesta en los datos. 67 00:03:49,040 --> 00:03:51,695 >> Ahora es el momento de cambiar el tamaño horizontal. 68 00:03:51,695 --> 00:03:56,880 si n es igual a 2, a continuación, para cada píxel en el infile, vamos a escribirlo 69 00:03:56,880 --> 00:04:00,870 dos veces en el archivo de salida. 70 00:04:00,870 --> 00:04:02,210 ¿Cómo escribimos archivos? 71 00:04:02,210 --> 00:04:06,400 Bueno, tenemos la función fwrite, por lo nos hemos tomado el puntero a la estructura 72 00:04:06,400 --> 00:04:10,170 que contiene los bytes que eres escribiendo desde, y luego pasar en 73 00:04:10,170 --> 00:04:14,430 tamaño, número, y la salida, donde usted va a estar escribiendo esto. 74 00:04:14,430 --> 00:04:19,200 Y a continuación, repetir un proceso, será capaz de un iterativo simple para bucle. 75 00:04:19,200 --> 00:04:21,740 >> Pero tenemos que recordar agregar relleno pulg 76 00:04:21,740 --> 00:04:26,040 El concepto de relleno es que, bueno, cada píxel es tres picaduras, pero la 77 00:04:26,040 --> 00:04:28,940 tamaño de cada necesidad scanline ser un múltiplo de 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Así que si el número de píxeles no es un múltiplo de 4, tenemos que añadir un poco de 79 00:04:33,660 --> 00:04:36,630 relleno, que está a sólo ceros. 80 00:04:36,630 --> 00:04:42,130 Ahora, a diferencia de quién lo hizo, y al contrario que copia, a continuación, la imagen infile y la 81 00:04:42,130 --> 00:04:44,370 archivo archivosalida haber diferentes tienen diferente de relleno porque son 82 00:04:44,370 --> 00:04:46,360 diferentes anchuras. 83 00:04:46,360 --> 00:04:46,690 >> Aceptar. 84 00:04:46,690 --> 00:04:51,050 Así que tal vez una fórmula haría muy útil aquí. 85 00:04:51,050 --> 00:04:55,120 Lo dejo a usted para averiguarlo, pero te dicen que, para escribir el relleno, 86 00:04:55,120 --> 00:04:59,360 bueno, es sólo una función fputc simple, que pasa en el carácter 87 00:04:59,360 --> 00:05:02,200 que quieres escribir, y luego el puntero del archivo que 88 00:05:02,200 --> 00:05:04,280 quiero escribir. 89 00:05:04,280 --> 00:05:08,670 Así que ahora que hemos cambiado el tamaño horizontal, y luego se usa el relleno, 90 00:05:08,670 --> 00:05:12,030 recuerde que usted necesita para mover su archivo indicador de posición, porque 91 00:05:12,030 --> 00:05:14,480 no puede fread en el relleno. 92 00:05:14,480 --> 00:05:18,230 Así que usted quiere asegurarse de que su archivo indicador de posición en el archivo de entrada 93 00:05:18,230 --> 00:05:19,980 es en el punto correcto. 94 00:05:19,980 --> 00:05:23,970 Porque también queremos cambiar el tamaño vertical. 95 00:05:23,970 --> 00:05:27,090 No podemos estirar horizontalmente, porque las necesidades de cada fila 96 00:05:27,090 --> 00:05:30,370 a copiar n veces. 97 00:05:30,370 --> 00:05:33,050 >> Ahora, hay varios diferentes maneras de hacer esto. 98 00:05:33,050 --> 00:05:39,010 Así que uno, se puede utilizar un método de reescritura, en que recordemos todos los píxeles 99 00:05:39,010 --> 00:05:42,840 de una fila determinada de una matriz, y luego escribimos la matriz como 100 00:05:42,840 --> 00:05:44,730 tantas veces como sea necesario. 101 00:05:44,730 --> 00:05:49,530 O está el método recopy donde, después de leer en una fila en el archivo de entrada 102 00:05:49,530 --> 00:05:53,530 y luego por escrito que en el archivo de salida, añadiendo el relleno, que FSEEK 103 00:05:53,530 --> 00:05:57,250 de nuevo al comienzo de la fila original, y luego repetir la horizontal 104 00:05:57,250 --> 00:05:58,710 cambio de tamaño a partir de ahí. 105 00:05:58,710 --> 00:06:02,280 Independientemente del método, sin embargo, usted quieren cada píxel que se repita 106 00:06:02,280 --> 00:06:06,370 n veces, y cada fila para ser repetida n veces también. 107 00:06:06,370 --> 00:06:09,160 >> Con esto, usted tendrá mapa de bits más grande que la vida. 108 00:06:09,160 --> 00:06:11,760 Mi nombre es Zamyla, y esto es CS50. 109 00:06:11,760 --> 00:06:19,542