[Música tocando] ZAMYLA CHAN: Vamos golpe as coisas com redimensionamento. Em redimensionamento, o usuário passará em, via a uma imagem bitmap linha de comando, que eles querem que você escala por um número que eles também passar, na linha de comando. Como fazemos isso? Bem, as primeiras coisas primeiro, vamos decompô-lo em etapas. Você vai querer abrir o infile que lhe dão, assim como criar e abrir o arquivo de saída que você está indo para colocar o imagem redimensionada dentro Então, porque você está redimensionando e porque é um bitmap, é um cabeçalho, de modo você vai atualizar também o cabeçalho informações para o arquivo de saída, e escrever que dentro Então, você vai ler em a linha de varredura da infile, pixel por pixel, redimensionamento horizontal e gravar esses pixels para o outfile, conforme especificado pela escala do usuário. Você vai se lembrar de adicionar preenchimento, se necessário. Mais sobre isso mais tarde. E então, também redimensionar verticalmente. OK. Então, isso vai ser um pouco mais complicado do que quem fez isto, mas o que há de semelhante é que copy.c vontade, mais uma vez, ser muito útil. Lembre-se que copy.c abre um arquivo, atualiza as informações de cabeçalho para o outfile, em seguida, lê para a linha de varredura, pixel-a-pixel, cada pixel escrito em linha de varredura do arquivo de saída. Então, novamente, o primeiro passo pode provavelmente ser a cp, copy.c, resize.c em seu diretório PSET5. Lembre-se, porém, antes de copiá-lo, para se certificar de que você entenda copy.c muito bem. OK. Então, vamos abrir um arquivo. Você sabe como fazer isso. Vou deixar isso para você. Em seguida, atualize as informações de cabeçalho para o arquivo de saída. Porque nós temos um novo bitmap, temos novas informações de cabeçalho. O que está mudando aqui? Bem, o tamanho do arquivo vai mudar porque nós vamos ter mais pixels do que antes. O tamanho da imagem é, assim, também vai mudar, como é o largura e altura. Então, quais variáveis ​​são aqueles, exatamente? Bem, se você olhar para o cabeçalho informações, você vê que há biSizeImage, que representa o total tamanho da imagem em bytes, incluindo pixels e estofamento. biWidth é a largura da imagem em pixels, menos o estofamento. biHeight é a altura da a imagem em pixels. E assim, aqueles estão contidos no estruturas e BITMAPFILEHEADER BITMAPINFOHEADER. Você pode dizer qual é qual por vai bmp.h e olhando para o Struct BITMAPINFOHEADER e vendo quais variáveis ​​estão listados lá. Então, para atualizar o cabeçalho outfiles informação, você vai querer alterar estes valores da a altura e a largura. Mas as chances são, você pode precisar de algum de informações de cabeçalho do InFile mais tarde, de modo melhor para manter o controle de ambos. Mas ser muito claro com a variável nomes para que você não acidentalmente escrever os valores incorretos no o cabeçalho para o arquivo de saída. Então, agora vamos começar a ler em a linha de varredura de pixel-a-pixel. Mais uma vez, vamos voltar para o nosso fiel arquivar I biblioteca / O, e olhar para a função fread. fread leva em um ponteiro para um struct que irá conter os bytes você está lendo no, o tamanho de cada elemento que você está lendo - novamente, sizeof vai ser útil funcionar aqui, o número do elementos de tamanho, o tamanho, que você está leitura, e, em seguida, finalmente, a inpointer, o arquivo que você está lendo a partir. Então você está tomando elementos números de tamanho de inpointer, e colocá-los em dados. Agora é hora de redimensionar horizontalmente. se n for igual a 2, então, para cada pixel na o infile, vamos escrevê-lo duas vezes no arquivo de saída. Como é que vamos gravar arquivos? Bem, nós temos a função fwrite, então temos tido o ponteiro para a struct que contém os bytes que você está escrevendo a partir de, e então passar em tamanho, número, e a saída, onde você vai estar escrevendo isso. E, em seguida, repetir o processo, será capaz de iterativo simples para loop. Mas precisamos lembrar para adicionar preenchimento dentro O conceito de preenchimento é que, bem, cada pixel é três picadas, mas o tamanho de cada linha de varredura must ser um múltiplo de 4 bytes. Assim, se o número de pixels não é um múltiplo de 4, é preciso adicionar um pouco de preenchimento, que fica a apenas zeros. Agora, ao contrário de quem fez isto, e ao contrário cópia, então imagem infile eo arquivo outfile têm diferentes têm estofamento diferente, porque eles são larguras diferentes. OK. Então, talvez, uma fórmula faria vir a calhar aqui. Vou deixar para você encontrá-lo para fora, mas dizer-lhe que, para escrever preenchimento, bem, é apenas uma função fputc simples, passando o caráter que você quer escrever, e depois o ponteiro do arquivo que você deseja gravar. Então, agora que já redimensionadas horizontalmente, e, em seguida, utilizado preenchimento lembre-se que você precisa mover seu arquivo indicador de posição, porque você não pode fread no estofamento. Então você quer ter certeza de que seu arquivo indicador de posição no infile está no ponto correto. Porque nós também queremos redimensionar verticalmente. Nós não podemos apenas esticá-lo na horizontal, porque todas as necessidades de linhas para ser copiado n vezes. Agora, existem vários diferentes maneiras de fazer isso. Então, um, podemos usar um método de reescrita, em que nos lembramos de todos os pixels de uma determinada linha em uma matriz, e então nós escrevemos essa matriz como quantas vezes for necessário. Ou há o método recopy onde, após a leitura de uma linha na InFile e em seguida, escrever isso no arquivo de saída, adicionando o preenchimento, nós fseek voltar para o início da linha original, e repita o horizontal redimensionamento de lá. Independentemente do método, porém, você vai quero que cada pixel a ser repetido n vezes, e cada linha a ser repetido n vezes bem. Com isso, você terá bitmap maior que a vida. Meu nome é Zamyla, e este é CS50.