>> [Glazba svira]
>> ZAMYLA Chan: Idemo udarac stvari s stanovati.
U stanovati, korisnik će proći u, putem naredbenog retka, uzorkovana slika koje
hoće li na ljestvici po broju da i oni prođu,
u zapovjednoj liniji.
Kako ćemo to učiniti?
>> Pa, krenimo redom, hajdemo razbiti ovaj dolje u koracima.
Vi idete da želite otvoriti INFILE koji su ti dali, kao i
stvoriti i otvoriti outfile da idete staviti
mijenjati image u.
Zatim, jer ste mijenjanje veličine, a zato što je bitmapa, to header, pa
ti ćeš također ažurirati zaglavlje Informacije za outfile,
i napisati da u.
Zatim, ti ćeš čitati u scanline od infile,
pixel-by-pixel, mijenjanje veličine vodoravno i pisanje tih piksela u
outfile, kao što je navedeno korisnikovim skali.
>> Ti ćeš se sjetiti dodavanje padding potrebi.
Više o tome kasnije.
A onda, također veličinu vertikalno.
OK.
Dakle, to će biti malo više kompliciranije nego Tko je to učinio, ali
što je slično je da copy.c će, opet, bilo vrlo korisno.
Zapamtite da copy.c otvara datoteku, ažurira podatke zaglavlju
outfile, onda čita u scanline, pixel-by-pixel, pisanje svaki piksel
u izlazne datoteke je scanline.
>> Pa opet, vaš prvi korak bi se vjerojatno biti na SP, copy.c, resize.c
u svoj PSET5 imenik.
Sjeti se ipak, prije nego što ga kopirati, kako bi bili sigurni da ste razumjeli
copy.c vrlo temeljito.
OK.
>> Tako ćemo otvoriti datoteku.
Znate kako se to radi.
Ja ću prepustiti vama.
Dalje, ažurirati podatke u zaglavlju za outfile.
Budući da imamo novi bitova, imamo novi header informacije.
Ono što se mijenja ovdje?
Pa, veličina datoteke će se promijeniti zato jer ćemo imati više
piksela nego prije.
Veličina slike je, dakle, također Promijenit će se, kao što je
širina i visina.
>> Dakle koje varijable su oni, točno?
Pa, ako pogledate u zaglavlju Informacije, vidim da postoji
biSizeImage, što predstavlja ukupno veličina slike u bajtovima,
uključujući piksela i padding.
biWidth je širina slike u pikselima, minus padding.
biHeight je visina slike u pikselima.
I tako one su sadržane u tvorevina BITMAPFILEHEADER i
BITMAPINFOHEADER.
Možete reći koje je što po će bmp.h i gledajući
BITMAPINFOHEADER rekonstruirati i vidim koje su varijable na popisu ima.
>> Dakle ažurirati outfiles zaglavlje Informacije, idete da želite
promijeniti te vrijednosti Visina i širina.
No, šanse su, možda trebate neke informacija zaglavlju infile-a
kasnije, tako najbolje pratiti oboje.
No, vrlo jasno s varijablom imena, tako da ne slučajno
pisati netočne vrijednosti u header za outfile.
>> Pa sad idemo na čitanje u scanline pixel-by-pixel.
Opet, mi ćemo se okrenuti našim vjernim file I / O biblioteka, i pogledati
fread funkcija.
fread traje u pointer na struct koji će sadržavati bajtova koje
što čitate u, veličina svakog element koji čitate -
opet, sizeof će biti korisna funkcionirati ovdje, broj
elementi veličine, veličine, da si čitanje u, a zatim konačno,
inpointer, datoteka koja što čitate iz.
Dakle, ti si uzimate broj elemenata veličine od inpointer, i
stavljajući ih u podacima.
>> Sada je vrijeme za promjenu veličine vodoravno.
ako je n jednak 2, a zatim na svaki piksel infile, idemo to napisati
dva puta u outfile.
Kako ćemo pisati datoteke?
Pa, imamo fwrite funkciju, pa uzeli smo pokazivač na struct
koji sadrži bajtova koje ste pismenog, a onda ćemo proći u
veličina, broj i izlaz, gdje je ti si idući u pisati da.
A onda za ponavljanje postupka, bit će mogli jednostavno iterativni za petlju.
>> No, moramo se sjetiti dodati padding u.
Koncept padding je da, dobro, svaki piksel je tri uboda, već
Veličina svakog scanline mošta biti višestruka od 4 bajta.
Dakle, ako je broj piksela nije višekratnik broja 4, moramo dodati neke
padding, što je samo nula.
Sada, za razliku Tko je to učinio, a za razliku od kopija, onda infile slika i
outfile datoteke su različite imaju drugačija padding, jer oni su
različite širine.
>> OK.
Dakle, možda bi formula dobro doći ovdje.
Ja ću ga ostaviti na vama je da to saznate, ali vam reći da, napisati padding,
dobro, to je samo jednostavna funkcija fputc, prolazi u liku
koji želite pisati, a zatim file pointer da
želim pisati.
Dakle, sada kada smo mijenjati vodoravno, a zatim koristiti padding,
zapamtite da morate premjestiti svoje datoteke Pokazivač položaja, jer vam
Ne možete fread u padding.
Dakle, želite da biste bili sigurni da je vaš predmet Indikator položaja na infile
je na ispravnom mjestu.
Jer, mi također želimo veličinu vertikalno.
Ne možemo ga se protežu vodoravno, jer svaki redak potrebe
treba kopirati n puta.
>> Sada, postoji nekoliko različitih načina za to.
Tako je jedan, možemo koristiti metodu prepisivanja, u da se sjetimo svih piksela
od obzirom red u niz, te onda ćemo napisati da je niz kao
onoliko puta koliko je potrebno.
Ili postoji metoda recopy gdje, nakon što je pročitao u jednom redu u infile
a zatim pisao da je u outfile, Dodavanjem padding, mi fseek
Natrag na početku izvorne redom, a zatim ponovite horizontalna
mijenjanje veličine od tamo.
Bez obzira na metodu, međutim, da ćete želite svaki piksel da se ponavlja
n puta, i svaki redak se ponavlja n puta, kao dobro.
>> Uz to, imat ćete bitmapa veći od života.
Moje ime je Zamyla, a to je CS50.