1 00:00:00,000 --> 00:00:10,210 >> [Música tocando] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Imos golpe as cousas con redimensionamento. 3 00:00:13,320 --> 00:00:17,710 En Adaptación, o usuario pasará en, vía a unha imaxe bitmap liña de comandos, que 4 00:00:17,710 --> 00:00:21,860 eles queren que escala por un número que eles tamén pasar, 5 00:00:21,860 --> 00:00:23,770 na liña de comandos. 6 00:00:23,770 --> 00:00:24,690 Como facemos iso? 7 00:00:24,690 --> 00:00:28,270 >> Ben, as primeiras cousas primeiro, imos decompô-lo en etapas. 8 00:00:28,270 --> 00:00:31,510 Vai querer abrir o infile que lle dan, así como 9 00:00:31,510 --> 00:00:35,560 crear e abrir o ficheiro de saída que está indo a poñer o 10 00:00:35,560 --> 00:00:38,020 imaxe redimensionada dentro 11 00:00:38,020 --> 00:00:42,050 Entón, por que está redimensionando e porque é un mapa de bits, é unha cabeceira, de xeito 12 00:00:42,050 --> 00:00:46,080 vai actualizar tamén a cabeceira información para o ficheiro de saída, 13 00:00:46,080 --> 00:00:47,950 e escribir que dentro 14 00:00:47,950 --> 00:00:51,850 Entón, vai ler en a liña de varrido da infile, 15 00:00:51,850 --> 00:00:56,890 pixel por pixel, redimensionamento horizontal e gardar eses píxeles ao 16 00:00:56,890 --> 00:01:00,910 outfile, conforme especificado pola escala do usuario. 17 00:01:00,910 --> 00:01:03,940 >> Vai lembrar de engadir recheo, se fose necesario. 18 00:01:03,940 --> 00:01:05,400 Máis sobre iso máis tarde. 19 00:01:05,400 --> 00:01:07,790 E entón, tamén cambiar o tamaño vertical. 20 00:01:07,790 --> 00:01:08,890 Aceptar. 21 00:01:08,890 --> 00:01:13,280 Entón, que vai ser un pouco máis complicado do que quen fixo isto, pero 22 00:01:13,280 --> 00:01:18,310 o que hai de parecido é que copy.c vontade, unha vez máis, ser moi útil. 23 00:01:18,310 --> 00:01:23,160 Lembre que copy.c abre un ficheiro, actualiza a información de cabeceira para o 24 00:01:23,160 --> 00:01:28,250 outfile, a continuación, le para a liña de varrido, pixel-a-pixel, cada pixel escrito 25 00:01:28,250 --> 00:01:30,510 en liña de varrido do ficheiro de saída. 26 00:01:30,510 --> 00:01:37,040 >> Entón, de novo, o primeiro paso pode ser ser a CP, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 no seu directorio PSET5. 28 00:01:40,560 --> 00:01:43,920 Teña en conta que, con todo, antes de copialo, para asegurarse de que entenda 29 00:01:43,920 --> 00:01:46,600 copy.c moi ben. 30 00:01:46,600 --> 00:01:47,620 Aceptar. 31 00:01:47,620 --> 00:01:49,880 >> Entón, imos abrir un arquivo. 32 00:01:49,880 --> 00:01:50,870 Vostede sabe como facelo. 33 00:01:50,870 --> 00:01:52,600 Vou deixar isto para vostede. 34 00:01:52,600 --> 00:01:56,050 Logo, actualiza a información de cabeceira para o arquivo de saída. 35 00:01:56,050 --> 00:01:59,240 Porque temos un novo mapa de bits, temos nova información de cabeceira. 36 00:01:59,240 --> 00:02:00,970 O que está cambiando aquí? 37 00:02:00,970 --> 00:02:06,000 Ben, o tamaño do arquivo vai cambiar porque nós imos ter máis 38 00:02:06,000 --> 00:02:07,900 píxeles que antes. 39 00:02:07,900 --> 00:02:11,060 O tamaño da imaxe é, así, tamén vai cambiar, como é o 40 00:02:11,060 --> 00:02:13,050 ancho e alto. 41 00:02:13,050 --> 00:02:17,180 >> Entón, cales variables son aqueles, exactamente? 42 00:02:17,180 --> 00:02:20,960 Ben, se ollar para a cabeceira información, ve que hai 43 00:02:20,960 --> 00:02:25,640 biSizeImage, que representa a Total tamaño da imaxe en bytes, 44 00:02:25,640 --> 00:02:28,340 incluíndo píxeles e estofado. 45 00:02:28,340 --> 00:02:32,520 biWidth é o ancho da imaxe en píxeles, menos o estofado. 46 00:02:32,520 --> 00:02:35,580 biHeight é a altura da a imaxe en píxeles. 47 00:02:35,580 --> 00:02:39,200 E así, quen están contidos no estruturas e BITMAPFILEHEADER 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Pode dicir cal é cal por vai bmp.h e ollando para o 50 00:02:45,300 --> 00:02:49,670 Struct BITMAPINFOHEADER e vendo cales variables están listados alí. 51 00:02:49,670 --> 00:02:54,700 >> Entón, para actualizar a cabeceira outfiles información, vai querer 52 00:02:54,700 --> 00:02:57,025 cambiar estes valores da a altura ea anchura. 53 00:02:57,025 --> 00:03:00,570 Pero as posibilidades son, pode ter algún de información de cabeceira do InFile 54 00:03:00,570 --> 00:03:03,670 máis tarde, de xeito mellor para manter o control de ambos. 55 00:03:03,670 --> 00:03:07,770 Pero ser moi claro coa variable nomes para que non accidentalmente 56 00:03:07,770 --> 00:03:12,490 escribir os valores incorrectos no a cabeceira no ficheiro de saída. 57 00:03:12,490 --> 00:03:16,160 >> Entón, agora imos comezar a ler en a liña de varrido de pixel-a-pixel. 58 00:03:16,160 --> 00:03:20,210 Unha vez máis, imos voltar ao noso fiel arquivar I biblioteca / O, e mirar para 59 00:03:20,210 --> 00:03:22,100 a función fread. 60 00:03:22,100 --> 00:03:26,150 fread ten en un punteiro a un struct que conterá os bytes 61 00:03:26,150 --> 00:03:30,130 estás lendo no, o tamaño de cada elemento que estás lendo - 62 00:03:30,130 --> 00:03:34,410 de novo, sizeof será útil funciona aquí, o número do 63 00:03:34,410 --> 00:03:38,820 elementos de tamaño, o tamaño, que está lectura, e logo, finalmente, a 64 00:03:38,820 --> 00:03:41,310 inpointer, o arquivo que estás lendo a partir. 65 00:03:41,310 --> 00:03:46,770 Entón está tomando elementos números de tamaño de inpointer, e 66 00:03:46,770 --> 00:03:49,040 poñelos datos. 67 00:03:49,040 --> 00:03:51,695 >> Agora é tempo de cambiar o tamaño horizontal. 68 00:03:51,695 --> 00:03:56,880 se non for igual a 2, entón, para cada pixel na o infile, imos escribilo lo 69 00:03:56,880 --> 00:04:00,870 dúas veces o ficheiro de saída. 70 00:04:00,870 --> 00:04:02,210 Como é que imos gardar arquivos? 71 00:04:02,210 --> 00:04:06,400 Así, temos a función fwrite, entón tivemos o apuntador á struct 72 00:04:06,400 --> 00:04:10,170 que contén os bytes que está escribindo a partir de, e entón pasar en 73 00:04:10,170 --> 00:04:14,430 tamaño, número, e á saída, onde vai estar escribindo isto. 74 00:04:14,430 --> 00:04:19,200 E, a continuación, repetir o proceso, será poder iterativo simple para loop. 75 00:04:19,200 --> 00:04:21,740 >> Pero necesitamos lembrar para engadir recheo dentro 76 00:04:21,740 --> 00:04:26,040 O concepto de recheo é que, así, cada pixel é tres picadas, pero o 77 00:04:26,040 --> 00:04:28,940 tamaño de cada liña de varredura must ser un múltiplo de 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Así, se o número de píxeles non é un múltiplo de 4, hai que engadir un pouco de 79 00:04:33,660 --> 00:04:36,630 recheo, que queda a só ceros. 80 00:04:36,630 --> 00:04:42,130 Agora, ao contrario de quen fixo isto, e ao contrario copia, entón imaxe infile eo 81 00:04:42,130 --> 00:04:44,370 ficheiro outfile teñen diferentes teñen estofado diferente, porque son 82 00:04:44,370 --> 00:04:46,360 anchos diferentes. 83 00:04:46,360 --> 00:04:46,690 >> Aceptar. 84 00:04:46,690 --> 00:04:51,050 Entón, talvez, unha fórmula faría vir a cadra aquí. 85 00:04:51,050 --> 00:04:55,120 Vou deixar para ti atopalo para fóra, pero dicirlle que, para escribir recheo, 86 00:04:55,120 --> 00:04:59,360 ben, é só unha función fputc simple, pasando o carácter 87 00:04:59,360 --> 00:05:02,200 que quere escribir, e logo o punteiro do ficheiro que 88 00:05:02,200 --> 00:05:04,280 quere gravar. 89 00:05:04,280 --> 00:05:08,670 Entón, agora que xa redimensionadas horizontal, e logo, utilizado recheo 90 00:05:08,670 --> 00:05:12,030 lembre que ten que mover o ficheiro indicador de posición, porque 91 00:05:12,030 --> 00:05:14,480 Non podes fread no estofado. 92 00:05:14,480 --> 00:05:18,230 Entón quere estar seguro de que o seu ficheiro indicador de posición no infile 93 00:05:18,230 --> 00:05:19,980 está no punto correcto. 94 00:05:19,980 --> 00:05:23,970 Porque nós tamén queremos cambiar o tamaño vertical. 95 00:05:23,970 --> 00:05:27,090 Non podemos só estirala lo en horizontal, porque as necesidades de liñas 96 00:05:27,090 --> 00:05:30,370 para ser copiado n veces. 97 00:05:30,370 --> 00:05:33,050 >> Agora, hai varios diferentes formas de facelo. 98 00:05:33,050 --> 00:05:39,010 Entón, un, podemos utilizar un método de reescrita, en que nos lembramos de todos os píxeles 99 00:05:39,010 --> 00:05:42,840 dunha determinada liña nunha matriz, e entón nós escribimos esta matriz como 100 00:05:42,840 --> 00:05:44,730 cantas veces sexa necesario. 101 00:05:44,730 --> 00:05:49,530 Ou hai método recopy onde, tras a lectura dunha liña na InFile 102 00:05:49,530 --> 00:05:53,530 e logo escribir isto no ficheiro de saída, engadindo o recheo, nós fseek 103 00:05:53,530 --> 00:05:57,250 volver ao principio da liña orixinal, e repita o horizontal 104 00:05:57,250 --> 00:05:58,710 Adaptación de alí. 105 00:05:58,710 --> 00:06:02,280 Independentemente do método, porén, vai quero que cada píxel a repetirse 106 00:06:02,280 --> 00:06:06,370 n veces, e cada liña sendo repetido n veces ben. 107 00:06:06,370 --> 00:06:09,160 >> Con iso, terá bitmap maior que a vida. 108 00:06:09,160 --> 00:06:11,760 O meu nome é Zamyla, e este é CS50. 109 00:06:11,760 --> 00:06:19,542