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