>> [CHWARAE CERDDORIAETH]
>> ZAMYLA Chan: ergyd Dewch i pethau i fyny gyda newid maint.
Yn newid maint, bydd y defnyddiwr yn pasio i mewn, drwy 'r archa bannod, delwedd bitmap sy'n
maent am i chi i raddfa gan nifer eu bod hefyd yn pasio i mewn,
yn y llinell orchymyn.
Sut ydym ni'n gwneud hyn?
>> Wel, pethau cyntaf yn gyntaf, gadewch i ni torri i lawr yn gamau.
Rydych yn mynd i eisiau i agor y infile eu bod yn rhoi i chi, yn ogystal â
creu ac agor y outfile y ydych yn mynd i roi'r
delwedd resized i mewn
Yna, oherwydd eich bod yn newid maint, a oherwydd ei fod yn didfap, ei fod yn pennawd, felly
ydych yn mynd hefyd i ddiweddaru y pennawd gwybodaeth ar gyfer y outfile,
ac ysgrifennu hynny mewn
Yna, rydych chi'n mynd i ddarllen i mewn y scanline y infile,
picsel-wrth-picsel, newid maint yn llorweddol ac ysgrifennu picsel hynny i mewn i'r
outfile, fel y nodir gan raddfa y defnyddiwr.
>> Rydych yn mynd i gofio ychwanegu padin yn ôl yr angen.
Mwy am hynny yn nes ymlaen.
Ac yna, hefyd newid maint fertigol.
OK.
Felly, mae hyn yn mynd i fod ychydig yn fwy cymhleth na Pwy Done It, ond
beth sy'n debyg yw bod copy.c bydd, unwaith eto, yn ddefnyddiol iawn.
Cofiwch fod copy.c yn agor ffeil, yn diweddaru'r wybodaeth pennawd ar gyfer yr
outfile, yna darllen i mewn i'r scanline, picsel-wrth-picsel, ysgrifennu pob picsel
i scanline y ffeil allbwn yn.
>> Felly eto, yn ôl pob tebyg y gallai eich cam cyntaf fydd cp, copy.c, resize.c
i mewn i'ch cyfeiriadur PSET5.
Cofiwch, fodd bynnag, cyn i chi gopïo, i wneud yn siŵr eich bod yn deall
copy.c drylwyr iawn.
OK.
>> Felly, gadewch i ni agor ffeil.
Rydych yn gwybod sut i wneud hynny.
Rydw i'n mynd i adael hynny i chi.
Nesaf, diweddaru'r wybodaeth pennawd gyfer y outfile.
Oherwydd bod gennym didfap newydd, mae gennym wybodaeth pennawd newydd.
Beth sy'n newid yma?
Wel, maint y ffeil yn mynd i newid oherwydd ein bod yn mynd i gael mwy o
picsel nag o'r blaen.
Mae maint ddelwedd yn, a thrwy hynny, hefyd yn mynd i newid, fel y mae'r
lled ac uchder.
>> Felly, pa newidynnau yw'r rhai, yn union?
Wel, os ydych yn edrych i mewn i'r pennawd gwybodaeth, byddwch yn gweld nad oes
biSizeImage, sy'n cynrychioli cyfanswm maint y ddelwedd mewn bytes,
gan gynnwys picsel a padin.
biWidth yw lled y ddelwedd mewn picseli, heb y padin.
biHeight yw uchder y ddelwedd mewn picseli.
Ac felly y rhai yn cael eu cynnwys yn y structs BITMAPFILEHEADER a
BITMAPINFOHEADER.
Gallwch ddweud pa un yw pa trwy mynd i bmp.h ac edrych ar y
Strwythur BITMAPINFOHEADER a gweld pa newidynnau yn cael eu rhestru yno.
>> Felly, i ddiweddaru'r pennawd outfiles gwybodaeth, eich bod yn mynd i fod eisiau
newid gwerthoedd hynny o'r uchder a'r lled.
Ond mae'n bur debyg, efallai y bydd angen rhai i chi gwybodaeth pennawd y infile yn
yn ddiweddarach, felly gorau i gadw trac o'r ddau.
Ond byddwch yn glir iawn gyda'ch amrywiol enwau fel nad ydych yn ddamweiniol
ysgrifennwch y gwerthoedd anghywir yn y pennawd ar gyfer yr outfile.
>> Felly nawr gadewch i ni fynd at ddarllen i mewn i y scanline pixel-by-picsel.
Unwaith eto, rydym yn mynd i droi at ein trusty ffeil I / O llyfrgell, ac edrych ar
y swyddogaeth fread.
fread cymryd mewn pwyntydd i strwythur a fydd yn cynnwys y bytes sy'n
ydych yn darllen yn, maint pob elfen sy'n ydych yn darllen -
eto, sizeof yn mynd i fod yn ddefnyddiol gweithredu yma, mae nifer y
elfennau o faint, maint, eich bod yn darllen i mewn, ac yna yn olaf, y
inpointer, y ffeil sydd eich bod yn darllen o.
Felly, rydych yn cymryd elfennau rhif o faint o inpointer, a
eu rhoi i mewn i data.
>> Nawr mae'n amser i newid maint llorweddol.
os n gyfystyr â 2, yna ar gyfer pob picsel yn y infile, rydym yn mynd i ysgrifennu
ddwywaith yn ystod y outfile.
Sut ydym yn ysgrifennu ffeiliau?
Wel, mae gennym y swyddogaeth fwrite, felly rydym wedi cymryd y pwyntydd i'r strwythur
sy'n cynnwys y bytes eich bod yn ysgrifennu o, ac yna rydym yn pasio mewn
maint, nifer, ac mae'r allbwn, lle ydych yn mynd i gael ei ysgrifennu hynny.
Ac yna ailadrodd proses, yn galluog ailadroddus syml ar gyfer ddolen.
>> Ond mae angen i gofio i ychwanegu padin mewn
Mae'r cysyniad o padin yw bod, yn dda, bob picsel yn dri brathiadau, ond mae'r
maint pob rhaid scanline fod yn lluosrif o 4 bytes.
Felly, os nad yw nifer o bicseli yn lluosog o 4, mae angen i ni ychwanegu rhywfaint o
padin, sydd ychydig sero.
Nawr, yn wahanol Pwy Done It, ac yn wahanol i copi, yna ddelwedd infile a'r
ffeil outfile wedi gwahanol wedi gwahanol padin oherwydd eu bod yn
wahanol led.
>> OK.
Felly efallai y byddai fformiwla yn dod i mewn 'n hylaw yma.
'N annhymerus' yn gadael i chi ddod o hyd allan, ond yn dweud wrthych fod, i ysgrifennu padin,
yn dda, 'i' jyst swyddogaeth fputc syml, pasio yn y cymeriad
eich bod am ysgrifennu, ac yna y pwyntydd ffeil yr ydych
dymuno ysgrifennu.
Felly nawr yr ydym wedi newid maint llorweddol, ac yna defnyddio padin,
cofiwch fod angen i chi symud eich ffeil dangosydd sefyllfa, oherwydd eich bod
Ni all fread i padin.
Felly rydych eisiau gwneud yn siŵr bod eich ffeil dangosydd safle yn y infile
ar y pwynt cywir.
Oherwydd ein bod hefyd yn awyddus i newid maint fertigol.
Ni allwn yn unig yn ymestyn ei llorweddol, oherwydd y mae pob anghenion rhes
gael eu copïo amseroedd n.
>> Erbyn hyn, mae yna nifer o wahanol ffyrdd o wneud hyn.
Felly un, gallwn ddefnyddio dull ailysgrifennu, yn ein bod yn cofio yr holl picsel
o res a roddir mewn amrywiaeth, ac Yna, byddwn yn ysgrifennu bod amrywiaeth fel
sawl gwaith yn ôl yr angen.
Neu mae y dull recopy lle, ar ôl darllen mewn un rhes yn y infile
ac yna ysgrifennu hynny yn y outfile, ychwanegu'r padin, rydym fseek
Nôl i ddechrau'r rhes gwreiddiol, ac yna ailadrodd y llorweddol
newid maint oddi yno.
Waeth beth fo'r dull, fodd bynnag, byddwch yn am i bob picsel cael ei ailadrodd
n amser, a phob rhes i fod yn dro ar ôl tro amseroedd n yn ogystal.
>> Gyda hynny, bydd gennych didfap fwy na bywyd.
Fy enw i yw Zamyla, ac mae hyn yn CS50.