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