>> [Música tocando]
>> ZAMYLA CHAN: Imos golpe as cousas con redimensionamento.
En Adaptación, o usuario pasará en, vía a unha imaxe bitmap liña de comandos, que
eles queren que escala por un número que eles tamén pasar,
na liña de comandos.
Como facemos iso?
>> Ben, as primeiras cousas primeiro, imos decompô-lo en etapas.
Vai querer abrir o infile que lle dan, así como
crear e abrir o ficheiro de saída que está indo a poñer o
imaxe redimensionada dentro
Entón, por que está redimensionando e porque é un mapa de bits, é unha cabeceira, de xeito
vai actualizar tamén a cabeceira información para o ficheiro de saída,
e escribir que dentro
Entón, vai ler en a liña de varrido da infile,
pixel por pixel, redimensionamento horizontal e gardar eses píxeles ao
outfile, conforme especificado pola escala do usuario.
>> Vai lembrar de engadir recheo, se fose necesario.
Máis sobre iso máis tarde.
E entón, tamén cambiar o tamaño vertical.
Aceptar.
Entón, que vai ser un pouco máis complicado do que quen fixo isto, pero
o que hai de parecido é que copy.c vontade, unha vez máis, ser moi útil.
Lembre que copy.c abre un ficheiro, actualiza a información de cabeceira para o
outfile, a continuación, le para a liña de varrido, pixel-a-pixel, cada pixel escrito
en liña de varrido do ficheiro de saída.
>> Entón, de novo, o primeiro paso pode ser ser a CP, copy.c, resize.c
no seu directorio PSET5.
Teña en conta que, con todo, antes de copialo, para asegurarse de que entenda
copy.c moi ben.
Aceptar.
>> Entón, imos abrir un arquivo.
Vostede sabe como facelo.
Vou deixar isto para vostede.
Logo, actualiza a información de cabeceira para o arquivo de saída.
Porque temos un novo mapa de bits, temos nova información de cabeceira.
O que está cambiando aquí?
Ben, o tamaño do arquivo vai cambiar porque nós imos ter máis
píxeles que antes.
O tamaño da imaxe é, así, tamén vai cambiar, como é o
ancho e alto.
>> Entón, cales variables son aqueles, exactamente?
Ben, se ollar para a cabeceira información, ve que hai
biSizeImage, que representa a Total tamaño da imaxe en bytes,
incluíndo píxeles e estofado.
biWidth é o ancho da imaxe en píxeles, menos o estofado.
biHeight é a altura da a imaxe en píxeles.
E así, quen están contidos no estruturas e BITMAPFILEHEADER
BITMAPINFOHEADER.
Pode dicir cal é cal por vai bmp.h e ollando para o
Struct BITMAPINFOHEADER e vendo cales variables están listados alí.
>> Entón, para actualizar a cabeceira outfiles información, vai querer
cambiar estes valores da a altura ea anchura.
Pero as posibilidades son, pode ter algún de información de cabeceira do InFile
máis tarde, de xeito mellor para manter o control de ambos.
Pero ser moi claro coa variable nomes para que non accidentalmente
escribir os valores incorrectos no a cabeceira no ficheiro de saída.
>> Entón, agora imos comezar a ler en a liña de varrido de pixel-a-pixel.
Unha vez máis, imos voltar ao noso fiel arquivar I biblioteca / O, e mirar para
a función fread.
fread ten en un punteiro a un struct que conterá os bytes
estás lendo no, o tamaño de cada elemento que estás lendo -
de novo, sizeof será útil funciona aquí, o número do
elementos de tamaño, o tamaño, que está lectura, e logo, finalmente, a
inpointer, o arquivo que estás lendo a partir.
Entón está tomando elementos números de tamaño de inpointer, e
poñelos datos.
>> Agora é tempo de cambiar o tamaño horizontal.
se non for igual a 2, entón, para cada pixel na o infile, imos escribilo lo
dúas veces o ficheiro de saída.
Como é que imos gardar arquivos?
Así, temos a función fwrite, entón tivemos o apuntador á struct
que contén os bytes que está escribindo a partir de, e entón pasar en
tamaño, número, e á saída, onde vai estar escribindo isto.
E, a continuación, repetir o proceso, será poder iterativo simple para loop.
>> Pero necesitamos lembrar para engadir recheo dentro
O concepto de recheo é que, así, cada pixel é tres picadas, pero o
tamaño de cada liña de varredura must ser un múltiplo de 4 bytes.
Así, se o número de píxeles non é un múltiplo de 4, hai que engadir un pouco de
recheo, que queda a só ceros.
Agora, ao contrario de quen fixo isto, e ao contrario copia, entón imaxe infile eo
ficheiro outfile teñen diferentes teñen estofado diferente, porque son
anchos diferentes.
>> Aceptar.
Entón, talvez, unha fórmula faría vir a cadra aquí.
Vou deixar para ti atopalo para fóra, pero dicirlle que, para escribir recheo,
ben, é só unha función fputc simple, pasando o carácter
que quere escribir, e logo o punteiro do ficheiro que
quere gravar.
Entón, agora que xa redimensionadas horizontal, e logo, utilizado recheo
lembre que ten que mover o ficheiro indicador de posición, porque
Non podes fread no estofado.
Entón quere estar seguro de que o seu ficheiro indicador de posición no infile
está no punto correcto.
Porque nós tamén queremos cambiar o tamaño vertical.
Non podemos só estirala lo en horizontal, porque as necesidades de liñas
para ser copiado n veces.
>> Agora, hai varios diferentes formas de facelo.
Entón, un, podemos utilizar un método de reescrita, en que nos lembramos de todos os píxeles
dunha determinada liña nunha matriz, e entón nós escribimos esta matriz como
cantas veces sexa necesario.
Ou hai método recopy onde, tras a lectura dunha liña na InFile
e logo escribir isto no ficheiro de saída, engadindo o recheo, nós fseek
volver ao principio da liña orixinal, e repita o horizontal
Adaptación de alí.
Independentemente do método, porén, vai quero que cada píxel a repetirse
n veces, e cada liña sendo repetido n veces ben.
>> Con iso, terá bitmap maior que a vida.
O meu nome é Zamyla, e este é CS50.