1 00:00:00,000 --> 00:00:10,210 >> [GIOCO MUSICA] 2 00:00:10,210 --> 00:00:13,320 >> ZAMYLA CHAN: colpo di Let le cose con ridimensionamento. 3 00:00:13,320 --> 00:00:17,710 In ridimensionamento, l'utente potrà passare, via la riga di comando, un'immagine bitmap che 4 00:00:17,710 --> 00:00:21,860 vogliono di scalare da un numero che anche loro passano, 5 00:00:21,860 --> 00:00:23,770 nella riga di comando. 6 00:00:23,770 --> 00:00:24,690 Come lo facciamo? 7 00:00:24,690 --> 00:00:28,270 >> Beh, prima cosa, cerchiamo di scomposizione in fasi. 8 00:00:28,270 --> 00:00:31,510 Stai andando a voler aprire la infile che ti danno, così come 9 00:00:31,510 --> 00:00:35,560 creare e aprire il file di output che si sta andando a mettere il 10 00:00:35,560 --> 00:00:38,020 immagine ridimensionata dentro 11 00:00:38,020 --> 00:00:42,050 Allora, perché sei ridimensionamento e perché è una bitmap, un colpo di testa, così 12 00:00:42,050 --> 00:00:46,080 avete intenzione di aggiornare anche l'intestazione informazioni per il file di output, 13 00:00:46,080 --> 00:00:47,950 e scrivere che dentro 14 00:00:47,950 --> 00:00:51,850 Quindi, si sta andando a leggere in la linea di scansione del infile, 15 00:00:51,850 --> 00:00:56,890 pixel per pixel, ridimensionamento orizzontale e scrivere quei pixel in 16 00:00:56,890 --> 00:01:00,910 outfile, come specificato dalla scala dell'utente. 17 00:01:00,910 --> 00:01:03,940 >> Stai andando a ricordare di aggiungere imbottitura, se necessario. 18 00:01:03,940 --> 00:01:05,400 Ne riparleremo più avanti. 19 00:01:05,400 --> 00:01:07,790 E poi, ridimensionare anche in verticale. 20 00:01:07,790 --> 00:01:08,890 OK. 21 00:01:08,890 --> 00:01:13,280 Quindi questo sarà un po 'più complicato di chi l'ha fatto, ma 22 00:01:13,280 --> 00:01:18,310 cosa c'è di simile è che copy.c sarà, nuovamente, rivelarsi molto utile. 23 00:01:18,310 --> 00:01:23,160 Ricordate che copy.c apre un file, aggiorna le informazioni di intestazione per l' 24 00:01:23,160 --> 00:01:28,250 outfile, quindi legge nel scanline, pixel per pixel, scrivere ogni pixel 25 00:01:28,250 --> 00:01:30,510 in linea di scansione del file di output. 26 00:01:30,510 --> 00:01:37,040 >> Quindi, di nuovo, il primo passo potrebbe probabilmente essere a cp, copy.c, resize.c 27 00:01:37,040 --> 00:01:40,560 nella directory PSET5. 28 00:01:40,560 --> 00:01:43,920 Ricordate, però, prima di copiarlo, per essere sicuri di aver compreso 29 00:01:43,920 --> 00:01:46,600 copy.c molto accuratamente. 30 00:01:46,600 --> 00:01:47,620 OK. 31 00:01:47,620 --> 00:01:49,880 >> Quindi cerchiamo di aprire un file. 32 00:01:49,880 --> 00:01:50,870 Tu sai come farlo. 33 00:01:50,870 --> 00:01:52,600 Ho intenzione di lasciare che a voi. 34 00:01:52,600 --> 00:01:56,050 Avanti, aggiornare le informazioni di intestazione per il file di output. 35 00:01:56,050 --> 00:01:59,240 Perché abbiamo una nuova bitmap, abbiamo nuove informazioni di intestazione. 36 00:01:59,240 --> 00:02:00,970 Che cosa sta cambiando qui? 37 00:02:00,970 --> 00:02:06,000 Ebbene, la dimensione del file sta per cambiare perché stiamo andando ad avere più 38 00:02:06,000 --> 00:02:07,900 pixel di prima. 39 00:02:07,900 --> 00:02:11,060 La dimensione dell'immagine è, quindi, anche cambierà, come è il 40 00:02:11,060 --> 00:02:13,050 larghezza e l'altezza. 41 00:02:13,050 --> 00:02:17,180 >> Quindi quali variabili sono quelli, esattamente? 42 00:02:17,180 --> 00:02:20,960 Beh, se si guarda nell'intestazione informazioni, vedete che c'è 43 00:02:20,960 --> 00:02:25,640 biSizeImage, che rappresenta il totale dimensione dell'immagine in byte, 44 00:02:25,640 --> 00:02:28,340 compresi pixel e imbottitura. 45 00:02:28,340 --> 00:02:32,520 biWidth è la larghezza dell'immagine in pixel, meno il padding. 46 00:02:32,520 --> 00:02:35,580 biHeight è l'altezza di dell'immagine in pixel. 47 00:02:35,580 --> 00:02:39,200 E così quelli che sono contenuti nel struct BITMAPFILEHEADER e 48 00:02:39,200 --> 00:02:40,390 BITMAPINFOHEADER. 49 00:02:40,390 --> 00:02:45,300 Si può dire che uno è che, per andando a bmp.h e guardando l' 50 00:02:45,300 --> 00:02:49,670 BITMAPINFOHEADER struct e vedere quali variabili sono elencate qui. 51 00:02:49,670 --> 00:02:54,700 >> Quindi, per aggiornare l'intestazione file di emissione informazione, si sta andando a voler 52 00:02:54,700 --> 00:02:57,025 modificare tali valori altezza e la larghezza. 53 00:02:57,025 --> 00:03:00,570 Ma le probabilità sono, potrebbe essere necessario un po ' delle informazioni di intestazione del infile 54 00:03:00,570 --> 00:03:03,670 successivamente, in modo migliore per tenere traccia di entrambi. 55 00:03:03,670 --> 00:03:07,770 Ma essere molto chiari con la variabile I nomi in modo che non si accidentalmente 56 00:03:07,770 --> 00:03:12,490 scrivere i valori non corretti in l'intestazione per il file di output. 57 00:03:12,490 --> 00:03:16,160 >> Così ora andiamo a leggere in scanline pixel-per-pixel. 58 00:03:16,160 --> 00:03:20,210 Ancora una volta, stiamo andando a girare al nostro fidato file di libreria di I / O, e guardare 59 00:03:20,210 --> 00:03:22,100 la funzione fread. 60 00:03:22,100 --> 00:03:26,150 fread prende in un puntatore ad una struct che conterrà i byte che 61 00:03:26,150 --> 00:03:30,130 stai leggendo, la dimensione di ogni elemento che stai leggendo - 62 00:03:30,130 --> 00:03:34,410 ancora una volta, sizeof sta per essere utile funzionamento qui, il numero del 63 00:03:34,410 --> 00:03:38,820 elementi di dimensioni, formato, che sei lettura, e infine, l' 64 00:03:38,820 --> 00:03:41,310 inpointer, il file stai leggendo da. 65 00:03:41,310 --> 00:03:46,770 Quindi stai prendendo elementi numerici di dimensioni da inpointer, e 66 00:03:46,770 --> 00:03:49,040 mettendoli in dati. 67 00:03:49,040 --> 00:03:51,695 >> Ora è il momento di ridimensionare in senso orizzontale. 68 00:03:51,695 --> 00:03:56,880 se n è uguale a 2, poi per ciascun pixel il infile, andremo a scrivere 69 00:03:56,880 --> 00:04:00,870 due volte nel file di output. 70 00:04:00,870 --> 00:04:02,210 Come si scrive i file? 71 00:04:02,210 --> 00:04:06,400 Bene, abbiamo la funzione fwrite, così abbiamo preso il puntatore alla struct 72 00:04:06,400 --> 00:04:10,170 che contiene i byte che sei scrivendo da, e poi passare 73 00:04:10,170 --> 00:04:14,430 dimensioni, numero, e l'uscita, dove si sta andando ad essere iscritto. 74 00:04:14,430 --> 00:04:19,200 E poi ripetere un processo, sarà grado un semplice iterativo ciclo for. 75 00:04:19,200 --> 00:04:21,740 >> Ma dobbiamo ricordare per aggiungere imbottitura dentro 76 00:04:21,740 --> 00:04:26,040 Il concetto di imbottitura è che, beh, ogni pixel è tre morsi, ma l' 77 00:04:26,040 --> 00:04:28,940 dimensione di ogni mosto scanline essere un multiplo di 4 byte. 78 00:04:28,940 --> 00:04:33,660 Quindi se il numero di pixel non è un multiplo di 4, abbiamo bisogno di aggiungere un po ' 79 00:04:33,660 --> 00:04:36,630 padding, che si trova a soli zeri. 80 00:04:36,630 --> 00:04:42,130 Ora, a differenza di chi l'ha fatto, e, a differenza copia, quindi l'immagine infile e l' 81 00:04:42,130 --> 00:04:44,370 il file outfile hanno differente ha padding diverso perché sono 82 00:04:44,370 --> 00:04:46,360 diverse larghezze. 83 00:04:46,360 --> 00:04:46,690 >> OK. 84 00:04:46,690 --> 00:04:51,050 Quindi, forse una formula sarebbe tornare utile qui. 85 00:04:51,050 --> 00:04:55,120 Lascio a voi scoprirlo, ma vi dico che, a scrivere imbottitura, 86 00:04:55,120 --> 00:04:59,360 bene, è solo una semplice funzione fputc, passando il carattere 87 00:04:59,360 --> 00:05:02,200 che si desidera scrivere, e poi il puntatore del file che si 88 00:05:02,200 --> 00:05:04,280 voglia di scrivere. 89 00:05:04,280 --> 00:05:08,670 Quindi, ora che abbiamo ridimensionato orizzontalmente, e poi utilizzato imbottitura, 90 00:05:08,670 --> 00:05:12,030 ricordate che è necessario spostare il file indicatore di posizione, perché si 91 00:05:12,030 --> 00:05:14,480 non può fread in imbottitura. 92 00:05:14,480 --> 00:05:18,230 Così si vuole fare in modo che il file indicatore di posizione nel infile 93 00:05:18,230 --> 00:05:19,980 è al punto giusto. 94 00:05:19,980 --> 00:05:23,970 Perché vogliamo anche ridimensionare verticalmente. 95 00:05:23,970 --> 00:05:27,090 Non possiamo allungare orizzontalmente, perché tutte le esigenze di riga 96 00:05:27,090 --> 00:05:30,370 da copiare n volte. 97 00:05:30,370 --> 00:05:33,050 >> Ora, ci sono diversi modi per fare questo. 98 00:05:33,050 --> 00:05:39,010 Così uno, possiamo usare un metodo di riscrittura, in che ricordiamo tutti i pixel 99 00:05:39,010 --> 00:05:42,840 di una determinata riga in una matrice, e allora scriviamo che la matrice come 100 00:05:42,840 --> 00:05:44,730 tante volte quante necessario. 101 00:05:44,730 --> 00:05:49,530 Oppure c'è il metodo di ricopiare in cui, dopo aver letto in una riga nella infile 102 00:05:49,530 --> 00:05:53,530 e poi per iscritto che nel file di output, aggiungendo l'imbottitura, si fseek 103 00:05:53,530 --> 00:05:57,250 indietro all'inizio della riga originale, e poi ripetere l'orizzontale 104 00:05:57,250 --> 00:05:58,710 ridimensionamento da lì. 105 00:05:58,710 --> 00:06:02,280 Indipendentemente dal metodo, però, ti vuole ogni pixel da ripetere 106 00:06:02,280 --> 00:06:06,370 n volte, e ogni fila per essere ripetuto n volte pure. 107 00:06:06,370 --> 00:06:09,160 >> Con questo, avrete bitmap più grande della vita. 108 00:06:09,160 --> 00:06:11,760 Il mio nome è Zamyla, e questo è CS50. 109 00:06:11,760 --> 00:06:19,542