>> [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.