[GIOCO MUSICA] ZAMYLA CHAN: colpo di Let le cose con ridimensionamento. In ridimensionamento, l'utente potrà passare, via la riga di comando, un'immagine bitmap che vogliono di scalare da un numero che anche loro passano, nella riga di comando. Come lo facciamo? Beh, prima cosa, cerchiamo di scomposizione in fasi. Stai andando a voler aprire la infile che ti danno, così come creare e aprire il file di output che si sta andando a mettere il immagine ridimensionata dentro Allora, perché sei ridimensionamento e perché è una bitmap, un colpo di testa, così avete intenzione di aggiornare anche l'intestazione informazioni per il file di output, e scrivere che dentro Quindi, si sta andando a leggere in la linea di scansione del infile, pixel per pixel, ridimensionamento orizzontale e scrivere quei pixel in outfile, come specificato dalla scala dell'utente. Stai andando a ricordare di aggiungere imbottitura, se necessario. Ne riparleremo più avanti. E poi, ridimensionare anche in verticale. OK. Quindi questo sarà un po 'più complicato di chi l'ha fatto, ma cosa c'è di simile è che copy.c sarà, nuovamente, rivelarsi molto utile. Ricordate che copy.c apre un file, aggiorna le informazioni di intestazione per l' outfile, quindi legge nel scanline, pixel per pixel, scrivere ogni pixel in linea di scansione del file di output. Quindi, di nuovo, il primo passo potrebbe probabilmente essere a cp, copy.c, resize.c nella directory PSET5. Ricordate, però, prima di copiarlo, per essere sicuri di aver compreso copy.c molto accuratamente. OK. Quindi cerchiamo di aprire un file. Tu sai come farlo. Ho intenzione di lasciare che a voi. Avanti, aggiornare le informazioni di intestazione per il file di output. Perché abbiamo una nuova bitmap, abbiamo nuove informazioni di intestazione. Che cosa sta cambiando qui? Ebbene, la dimensione del file sta per cambiare perché stiamo andando ad avere più pixel di prima. La dimensione dell'immagine è, quindi, anche cambierà, come è il larghezza e l'altezza. Quindi quali variabili sono quelli, esattamente? Beh, se si guarda nell'intestazione informazioni, vedete che c'è biSizeImage, che rappresenta il totale dimensione dell'immagine in byte, compresi pixel e imbottitura. biWidth è la larghezza dell'immagine in pixel, meno il padding. biHeight è l'altezza di dell'immagine in pixel. E così quelli che sono contenuti nel struct BITMAPFILEHEADER e BITMAPINFOHEADER. Si può dire che uno è che, per andando a bmp.h e guardando l' BITMAPINFOHEADER struct e vedere quali variabili sono elencate qui. Quindi, per aggiornare l'intestazione file di emissione informazione, si sta andando a voler modificare tali valori altezza e la larghezza. Ma le probabilità sono, potrebbe essere necessario un po ' delle informazioni di intestazione del infile successivamente, in modo migliore per tenere traccia di entrambi. Ma essere molto chiari con la variabile I nomi in modo che non si accidentalmente scrivere i valori non corretti in l'intestazione per il file di output. Così ora andiamo a leggere in scanline pixel-per-pixel. Ancora una volta, stiamo andando a girare al nostro fidato file di libreria di I / O, e guardare la funzione fread. fread prende in un puntatore ad una struct che conterrà i byte che stai leggendo, la dimensione di ogni elemento che stai leggendo - ancora una volta, sizeof sta per essere utile funzionamento qui, il numero del elementi di dimensioni, formato, che sei lettura, e infine, l' inpointer, il file stai leggendo da. Quindi stai prendendo elementi numerici di dimensioni da inpointer, e mettendoli in dati. Ora è il momento di ridimensionare in senso orizzontale. se n è uguale a 2, poi per ciascun pixel il infile, andremo a scrivere due volte nel file di output. Come si scrive i file? Bene, abbiamo la funzione fwrite, così abbiamo preso il puntatore alla struct che contiene i byte che sei scrivendo da, e poi passare dimensioni, numero, e l'uscita, dove si sta andando ad essere iscritto. E poi ripetere un processo, sarà grado un semplice iterativo ciclo for. Ma dobbiamo ricordare per aggiungere imbottitura dentro Il concetto di imbottitura è che, beh, ogni pixel è tre morsi, ma l' dimensione di ogni mosto scanline essere un multiplo di 4 byte. Quindi se il numero di pixel non è un multiplo di 4, abbiamo bisogno di aggiungere un po ' padding, che si trova a soli zeri. Ora, a differenza di chi l'ha fatto, e, a differenza copia, quindi l'immagine infile e l' il file outfile hanno differente ha padding diverso perché sono diverse larghezze. OK. Quindi, forse una formula sarebbe tornare utile qui. Lascio a voi scoprirlo, ma vi dico che, a scrivere imbottitura, bene, è solo una semplice funzione fputc, passando il carattere che si desidera scrivere, e poi il puntatore del file che si voglia di scrivere. Quindi, ora che abbiamo ridimensionato orizzontalmente, e poi utilizzato imbottitura, ricordate che è necessario spostare il file indicatore di posizione, perché si non può fread in imbottitura. Così si vuole fare in modo che il file indicatore di posizione nel infile è al punto giusto. Perché vogliamo anche ridimensionare verticalmente. Non possiamo allungare orizzontalmente, perché tutte le esigenze di riga da copiare n volte. Ora, ci sono diversi modi per fare questo. Così uno, possiamo usare un metodo di riscrittura, in che ricordiamo tutti i pixel di una determinata riga in una matrice, e allora scriviamo che la matrice come tante volte quante necessario. Oppure c'è il metodo di ricopiare in cui, dopo aver letto in una riga nella infile e poi per iscritto che nel file di output, aggiungendo l'imbottitura, si fseek indietro all'inizio della riga originale, e poi ripetere l'orizzontale ridimensionamento da lì. Indipendentemente dal metodo, però, ti vuole ogni pixel da ripetere n volte, e ogni fila per essere ripetuto n volte pure. Con questo, avrete bitmap più grande della vita. Il mio nome è Zamyla, e questo è CS50.