>> [MUSIC Playing]
>> ZAMYLA CHAN: goditje Le gjërat deri me resize.
Në resize, përdoruesi do të kalojë në, nëpërmjet command line, një imazh bitmap që
ata duan që ju të shkallë nga një numër që edhe ata të kalojnë në,
në vijën komanduese.
Si e bëjmë këtë?
>> E pra, gjërat e para e para, le të të thyer këtë poshtë në hapa.
Ju jeni do të duan për të hapur infile që të japë, si dhe
të krijojë dhe të hapur outfile që ju do të jeni për të vënë
image ndryshohet madhësia in
Pastaj, për shkak se ju jeni duke ndryshuar, dhe të sepse kjo është një bitmap, atë një header, kështu
ju do të jeni për të rinovuar header Informata për outfile,
dhe shkruajnë se in
Pastaj, ju do të jeni për të lexuar në scanline i infile,
pixel-nga-piksel, duke ndryshuar horizontalisht dhe shkrim ato piksele në
outfile, siç është specifikuar nga shkallë të përdoruesit.
>> Ju jeni do të mbani mend që të shtoni mbushje sipas nevojës.
Më shumë për këtë më vonë.
Dhe pastaj, edhe resize vertikalisht.
OK.
Pra, kjo do të jetë pak më shumë komplikuar se Kush Done It, por
çfarë është e ngjashme është se copy.c do, përsëri, të provojë shumë i dobishëm.
Mos harroni se copy.c hap një dosje, azhurnon informacionin header për
outfile, pastaj lexon në scanline, pixel-nga-piksel, duke shkruar çdo piksel
në scanline e prodhimit file-së.
>> Pra, përsëri, hapi juaj i parë mund ndoshta të jetë në krah, copy.c, resize.c
në directory tuaj PSET5.
Mos harroni edhe pse, para se të kopje atë, për të siguruar që ju të kuptoni
copy.c shumë tërësisht.
OK.
>> Pra, le të hapur një skedë.
Ti e di se si ta bëjnë këtë.
Unë jam duke shkuar për të lënë atë për ju.
Tjetra, update informacion header për outfile.
Sepse ne kemi një bitmap të re, ne kemi të reja info header.
Çfarë ka ndryshuar këtu?
E pra, madhësia e skedës do të ndryshojë sepse ne do të kemi më shumë
piksele se më parë.
Madhësia imazhit është, pra, edhe do të ndryshojë, pasi është
gjerësia dhe lartësia.
>> Pra cilat variablat janë ata, pikërisht?
E pra, në qoftë se ju shikoni në kokë informacion, ju shihni nuk ka
biSizeImage, e cila përfaqëson totalin Madhësia e imazhit në bytes,
përfshirë pixels dhe mbushje.
biWidth është gjerësia e imazhit në pixels, minus mbushje.
biHeight është lartësia e imazhit në pixel.
Dhe kështu ata që janë të përfshira në structs BITMAPFILEHEADER dhe
BITMAPINFOHEADER.
Ju mund të thoni se cilat një është e cila nga do të bmp.h dhe duke kërkuar në
Struct BITMAPINFOHEADER dhe duke parë variablat të cilat janë të listuara atje.
>> Pra, për të rinovuar header outfiles informacion, ju jeni do të duan të
ndryshojë këto vlera të lartësi dhe gjerësi.
Por, shanset janë, ju mund të kenë nevojë disa i header informacionit të infile-së
më vonë, në mënyrë më të mirë për të mbajtur nën të dyja.
Por të jetë shumë e qartë me ndryshore tuaj emra në mënyrë që ju nuk aksidentalisht
shkruani vlerat pasakta në header për outfile.
>> Pra, tani le të marrë për të lexuar në scanline pixel-nga-pixel.
Përsëri, ne do të kthehet për të cilët ka besim tonë paraqesë I / O bibliotekë, dhe të kërkoni në
funksioni fread.
fread merr në një tregues për një struct që do të përmbajë bytes që
jeni duke lexuar në, madhësia e secilit element që ju jeni duke e lexuar -
përsëri, sizeof do të jenë të dobishme funksionojnë here, numri i
elementet e madhësisë, madhësisë, që ju të jeni lexim in, dhe pastaj në fund,
inpointer, fotografi që ju jeni duke lexuar nga.
Pra, ju jeni duke marrë elemente numër e madhësisë nga inpointer, dhe
vënien e tyre në të dhëna.
>> Tani është koha për të resize horizontalisht.
nëse n është e barabartë me 2, atëherë për çdo piksel në infile, ne jemi duke shkuar për të shkruar atë
dy herë në outfile.
Si e kemi shkruar fotografi?
E pra, ne kemi funksionin fwrite, kështu ne kemi marrë kursorin në struct
që përmban bytes që ju jeni shkrim nga, dhe pastaj ne të kalojë në
madhësia, numri, dhe prodhimi, ku ju do të jeni të shkruar atë.
Dhe pastaj për të përsëritur një proces, do të jetë gjendje një përsëritës të thjeshtë për lak.
>> Por ne duhet të kujtojmë për të shtuar mbushje in
Koncepti i mbushje është se, mirë, çdo piksel është tre kafshon, por
Madhësia e çdo scanline mushtit të jetë një shumëfish i 4 bytes.
Kështu nese numri i piksel nuk është një shumëfish i 4, ne duhet të shtoni disa
mbushje, e cila është vetëm zero.
Tani, ndryshe nga Kush Done It, dhe ndryshe nga kopje, atëherë imazhi infile dhe
fotografi outfile kanë të ndryshme kanë mbushje e ndryshme, sepse ata janë
widths të ndryshme.
>> OK.
Pra, ndoshta një formulë do të të jetë në dispozicion këtu.
Unë do të lënë atë për ju për të gjetur atë, por ju them se, për të shkruar mbushje,
mirë, kjo është vetëm një funksion të thjeshtë fputc, duke kaluar në karakter
që ju dëshironi të shkruani, dhe pastaj file pointer që ju
duan të shkruajnë për të.
Pra, tani që ne kemi ridimensionuar horizontalisht, dhe pastaj të përdoren mbushje,
mos harroni se ju keni nevojë për të lëvizur dosjen tuaj tregues pozicion, sepse ju
nuk mund fread në mbushje.
Pra, ju doni të bëni të sigurtë që dosja juaj tregues pozicion në infile
është në pikën korrekte.
Sepse ne gjithashtu duam të resize vertikalisht.
Ne nuk mund të zgjas atë horizontalisht, sepse çdo nevojat rresht
për të kopjohet herë n.
>> Tani, ka disa të ndryshme mënyra për ta bërë këtë.
Pra një, ne mund të përdorim një metodë rishkruaj, në që ne të kujtojmë të gjitha pixels
e një rresht dhënë në një grup, dhe atëherë e kemi shkruar këtë koleksion si
shumë herë si të nevojshme.
Apo nuk ka metoda recopy ku, pas leximit në një rresht në infile
dhe pastaj shkrim që në outfile, duke shtuar mbushje, ne fseek
mbështetur në fillim të rreshtit origjinal, dhe pastaj të përsëritur horizontal
duke ndryshuar nga atje.
Pavarësisht nga metoda, edhe pse, ju do të duan çdo pixel që të përsëritet
n herë, dhe çdo rresht të jetë përsëritet herë n si.
>> Me këtë, ju do të keni bitmap më të mëdha se sa jeta.
Emri im është Zamyla, dhe kjo është CS50.