1 00:00:00,000 --> 00:00:10,210 >> [Música tocando] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: Vamos golpe as coisas com redimensionamento. 3 00:00:13,320 --> 00:00:17,710 Em redimensionamento, o usuário passará em, via a uma imagem bitmap linha de comando, que 4 00:00:17,710 --> 00:00:21,860 eles querem que você escala por um número que eles também passar, 5 00:00:21,860 --> 00:00:23,770 na linha de comando. 6 00:00:23,770 --> 00:00:24,690 Como fazemos isso? 7 00:00:24,690 --> 00:00:28,270 >> Bem, as primeiras coisas primeiro, vamos decompô-lo em etapas. 8 00:00:28,270 --> 00:00:31,510 Você vai querer abrir o infile que lhe dão, assim como 9 00:00:31,510 --> 00:00:35,560 criar e abrir o arquivo de saída que você está indo para colocar o 10 00:00:35,560 --> 00:00:38,020 imagem redimensionada dentro 11 00:00:38,020 --> 00:00:42,050 Então, porque você está redimensionando e porque é um bitmap, é um cabeçalho, de modo 12 00:00:42,050 --> 00:00:46,080 você vai atualizar também o cabeçalho informações para o arquivo de saída, 13 00:00:46,080 --> 00:00:47,950 e escrever que dentro 14 00:00:47,950 --> 00:00:51,850 Então, você vai ler em a linha de varredura da infile, 15 00:00:51,850 --> 00:00:56,890 pixel por pixel, redimensionamento horizontal e gravar esses pixels para o 16 00:00:56,890 --> 00:01:00,910 outfile, conforme especificado pela escala do usuário. 17 00:01:00,910 --> 00:01:03,940 >> Você vai se lembrar de adicionar preenchimento, se necessário. 18 00:01:03,940 --> 00:01:05,400 Mais sobre isso mais tarde. 19 00:01:05,400 --> 00:01:07,790 E então, também redimensionar verticalmente. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Então, isso vai ser um pouco mais complicado do que quem fez isto, mas 22 00:01:13,280 --> 00:01:18,310 o que há de semelhante é que copy.c vontade, mais uma vez, ser muito útil. 23 00:01:18,310 --> 00:01:23,160 Lembre-se que copy.c abre um arquivo, atualiza as informações de cabeçalho para o 24 00:01:23,160 --> 00:01:28,250 outfile, em seguida, lê para a linha de varredura, pixel-a-pixel, cada pixel escrito 25 00:01:28,250 --> 00:01:30,510 em linha de varredura do arquivo de saída. 26 00:01:30,510 --> 00:01:37,040 >> Então, novamente, o primeiro passo pode provavelmente ser a cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 em seu diretório PSET5. 28 00:01:40,560 --> 00:01:43,920 Lembre-se, porém, antes de copiá-lo, para se certificar de que você entenda 29 00:01:43,920 --> 00:01:46,600 copy.c muito bem. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Então, vamos abrir um arquivo. 32 00:01:49,880 --> 00:01:50,870 Você sabe como fazer isso. 33 00:01:50,870 --> 00:01:52,600 Vou deixar isso para você. 34 00:01:52,600 --> 00:01:56,050 Em seguida, atualize as informações de cabeçalho para o arquivo de saída. 35 00:01:56,050 --> 00:01:59,240 Porque nós temos um novo bitmap, temos novas informações de cabeçalho. 36 00:01:59,240 --> 00:02:00,970 O que está mudando aqui? 37 00:02:00,970 --> 00:02:06,000 Bem, o tamanho do arquivo vai mudar porque nós vamos ter mais 38 00:02:06,000 --> 00:02:07,900 pixels do que antes. 39 00:02:07,900 --> 00:02:11,060 O tamanho da imagem é, assim, também vai mudar, como é o 40 00:02:11,060 --> 00:02:13,050 largura e altura. 41 00:02:13,050 --> 00:02:17,180 >> Então, quais variáveis ​​são aqueles, exatamente? 42 00:02:17,180 --> 00:02:20,960 Bem, se você olhar para o cabeçalho informações, você vê que há 43 00:02:20,960 --> 00:02:25,640 biSizeImage, que representa o total tamanho da imagem em bytes, 44 00:02:25,640 --> 00:02:28,340 incluindo pixels e estofamento. 45 00:02:28,340 --> 00:02:32,520 biWidth é a largura da imagem em pixels, menos o estofamento. 46 00:02:32,520 --> 00:02:35,580 biHeight é a altura da a imagem em pixels. 47 00:02:35,580 --> 00:02:39,200 E assim, aqueles estão contidos no estruturas e BITMAPFILEHEADER 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Você pode dizer qual é qual por vai bmp.h e olhando para o 50 00:02:45,300 --> 00:02:49,670 Struct BITMAPINFOHEADER e vendo quais variáveis ​​estão listados lá. 51 00:02:49,670 --> 00:02:54,700 >> Então, para atualizar o cabeçalho outfiles informação, você vai querer 52 00:02:54,700 --> 00:02:57,025 alterar estes valores da a altura e a largura. 53 00:02:57,025 --> 00:03:00,570 Mas as chances são, você pode precisar de algum de informações de cabeçalho do InFile 54 00:03:00,570 --> 00:03:03,670 mais tarde, de modo melhor para manter o controle de ambos. 55 00:03:03,670 --> 00:03:07,770 Mas ser muito claro com a variável nomes para que você não acidentalmente 56 00:03:07,770 --> 00:03:12,490 escrever os valores incorretos no o cabeçalho para o arquivo de saída. 57 00:03:12,490 --> 00:03:16,160 >> Então, agora vamos começar a ler em a linha de varredura de pixel-a-pixel. 58 00:03:16,160 --> 00:03:20,210 Mais uma vez, vamos voltar para o nosso fiel arquivar I biblioteca / O, e olhar para 59 00:03:20,210 --> 00:03:22,100 a função fread. 60 00:03:22,100 --> 00:03:26,150 fread leva em um ponteiro para um struct que irá conter os bytes 61 00:03:26,150 --> 00:03:30,130 você está lendo no, o tamanho de cada elemento que você está lendo - 62 00:03:30,130 --> 00:03:34,410 novamente, sizeof vai ser útil funcionar aqui, o número do 63 00:03:34,410 --> 00:03:38,820 elementos de tamanho, o tamanho, que você está leitura, e, em seguida, finalmente, a 64 00:03:38,820 --> 00:03:41,310 inpointer, o arquivo que você está lendo a partir. 65 00:03:41,310 --> 00:03:46,770 Então você está tomando elementos números de tamanho de inpointer, e 66 00:03:46,770 --> 00:03:49,040 colocá-los em dados. 67 00:03:49,040 --> 00:03:51,695 >> Agora é hora de redimensionar horizontalmente. 68 00:03:51,695 --> 00:03:56,880 se n for igual a 2, então, para cada pixel na o infile, vamos escrevê-lo 69 00:03:56,880 --> 00:04:00,870 duas vezes no arquivo de saída. 70 00:04:00,870 --> 00:04:02,210 Como é que vamos gravar arquivos? 71 00:04:02,210 --> 00:04:06,400 Bem, nós temos a função fwrite, então temos tido o ponteiro para a struct 72 00:04:06,400 --> 00:04:10,170 que contém os bytes que você está escrevendo a partir de, e então passar em 73 00:04:10,170 --> 00:04:14,430 tamanho, número, e a saída, onde você vai estar escrevendo isso. 74 00:04:14,430 --> 00:04:19,200 E, em seguida, repetir o processo, será capaz de iterativo simples para loop. 75 00:04:19,200 --> 00:04:21,740 >> Mas precisamos lembrar para adicionar preenchimento dentro 76 00:04:21,740 --> 00:04:26,040 O conceito de preenchimento é que, bem, cada pixel é três picadas, mas o 77 00:04:26,040 --> 00:04:28,940 tamanho de cada linha de varredura must ser um múltiplo de 4 bytes. 78 00:04:28,940 --> 00:04:33,660 Assim, se o número de pixels não é um múltiplo de 4, é preciso adicionar um pouco de 79 00:04:33,660 --> 00:04:36,630 preenchimento, que fica a apenas zeros. 80 00:04:36,630 --> 00:04:42,130 Agora, ao contrário de quem fez isto, e ao contrário cópia, então imagem infile eo 81 00:04:42,130 --> 00:04:44,370 arquivo outfile têm diferentes têm estofamento diferente, porque eles são 82 00:04:44,370 --> 00:04:46,360 larguras diferentes. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Então, talvez, uma fórmula faria vir a calhar aqui. 85 00:04:51,050 --> 00:04:55,120 Vou deixar para você encontrá-lo para fora, mas dizer-lhe que, para escrever preenchimento, 86 00:04:55,120 --> 00:04:59,360 bem, é apenas uma função fputc simples, passando o caráter 87 00:04:59,360 --> 00:05:02,200 que você quer escrever, e depois o ponteiro do arquivo que você 88 00:05:02,200 --> 00:05:04,280 deseja gravar. 89 00:05:04,280 --> 00:05:08,670 Então, agora que já redimensionadas horizontalmente, e, em seguida, utilizado preenchimento 90 00:05:08,670 --> 00:05:12,030 lembre-se que você precisa mover seu arquivo indicador de posição, porque você 91 00:05:12,030 --> 00:05:14,480 não pode fread no estofamento. 92 00:05:14,480 --> 00:05:18,230 Então você quer ter certeza de que seu arquivo indicador de posição no infile 93 00:05:18,230 --> 00:05:19,980 está no ponto correto. 94 00:05:19,980 --> 00:05:23,970 Porque nós também queremos redimensionar verticalmente. 95 00:05:23,970 --> 00:05:27,090 Nós não podemos apenas esticá-lo na horizontal, porque todas as necessidades de linhas 96 00:05:27,090 --> 00:05:30,370 para ser copiado n vezes. 97 00:05:30,370 --> 00:05:33,050 >> Agora, existem vários diferentes maneiras de fazer isso. 98 00:05:33,050 --> 00:05:39,010 Então, um, podemos usar um método de reescrita, em que nos lembramos de todos os pixels 99 00:05:39,010 --> 00:05:42,840 de uma determinada linha em uma matriz, e então nós escrevemos essa matriz como 100 00:05:42,840 --> 00:05:44,730 quantas vezes for necessário. 101 00:05:44,730 --> 00:05:49,530 Ou há o método recopy onde, após a leitura de uma linha na InFile 102 00:05:49,530 --> 00:05:53,530 e em seguida, escrever isso no arquivo de saída, adicionando o preenchimento, nós fseek 103 00:05:53,530 --> 00:05:57,250 voltar para o início da linha original, e repita o horizontal 104 00:05:57,250 --> 00:05:58,710 redimensionamento de lá. 105 00:05:58,710 --> 00:06:02,280 Independentemente do método, porém, você vai quero que cada pixel a ser repetido 106 00:06:02,280 --> 00:06:06,370 n vezes, e cada linha a ser repetido n vezes bem. 107 00:06:06,370 --> 00:06:09,160 >> Com isso, você terá bitmap maior que a vida. 108 00:06:09,160 --> 00:06:11,760 Meu nome é Zamyla, e este é CS50. 109 00:06:11,760 --> 00:06:19,542