>> [MUSIC PLAYBACK]
>> ZAMYLA CHAN: Poďme rana čo sa s veľkosť.
V zmeny veľkosti, bude užívateľ odovzdať prostredníctvom príkazového riadku, bitmapový obraz, ktorý
chcú, aby ste mierku podľa čísla že tiež odovzdať,
v príkazovom riadku.
Ako to robíme?
>> No, v prvej veci Po prvé, poďme rozčleniť tento systém do krokov.
Budeš chcieť otvoriť uložená_hra že sa vám, rovnako ako
vytvoriť a otvoriť outfile, že sa chystáte dať
Snímku so zmenenou veľkosťou palcov
Potom, pretože ste zmenu veľkosti, a pretože je to bitmapa, to záhlavie, tak
budete tiež aktualizovať hlavičku Informácie o outFile,
a napísať, že dovnútra
Potom budete čítať do scanline na vstupný súbor,
pixel-by-pixel, veľkosti horizontálne a písanie tých pixelov do
outfile, ako je uvedené podľa stupnice užívateľa.
>> Budeš mať na pamäti, pridať výplň podľa potreby.
Viac o tom neskôr.
A potom tiež zmeniť veľkosť v zvislom smere.
OK.
Takže to bude trochu viac zložitejšie, než kto to urobil, ale
čo je podobné je to copy.c bude, opäť ukázať ako veľmi užitočné.
Pamätajte si, že copy.c otvorí súbor, aktualizuje informácie o záhlavie pre
outfile, potom prečíta do scanline, pixel-by-pixel, písať každý pixel
do scanline výstupného súboru.
>> Takže znova, môže váš prvý krok pravdepodobne bolo cp, copy.c, resize.c
do PSET5 adresára.
Pamätajte, že pred kopírovaním, Uistite sa, že ste pochopili,
copy.c veľmi dôkladne.
OK.
>> Takže poďme otvoriť súbor.
Viete, ako to urobiť.
Chystám sa nechať, že na vás.
Ďalšie, aktualizujte informácie o záhlaví outFile.
Vzhľadom k tomu, že máme nové bitmapy, máme nové informácie hlavičky.
Čo sa mení tu?
No, veľkosť súboru sa zmení pretože budeme mať viac
pixelov než predtým.
Veľkosť obrazu, tak aj zmení, ako je
šírka a výška.
>> Takže, ktoré premenné sú tie, presne?
No, keď sa pozriete do záhlavia informácie, môžete vidieť, že je
biSizeImage, čo predstavuje celkový Veľkosť obrazu v bajtoch,
vrátane pixelov a polstrovanie.
biWidth je šírka obrázku v pixeloch, bez polstrovania.
biHeight je výška obrázku v pixeloch.
A tak tie sú obsiahnuté v structs BITMAPFILEHEADER a
BITMAPINFOHEADER.
Môžete povedať, ktorý z nich je ktorý by bude bmp.h a pri pohľade na
BITMAPINFOHEADER struct a videnie premenných, ktoré sú v ňom uvedené.
>> Takže aktualizovať outfiles záhlavia informácie, budete chcieť, aby
Zmena týchto hodnôt výška a šírka.
Ale šanca, že možno budete musieť niektoré informácie hlavičku v Infil je
neskôr, tak najlepšie sledovať z oboch.
Ale byť veľmi jasné, s premennou mená tak, že nemáte náhodou
napísať nesprávne hodnoty v záhlavie outFile.
>> Takže teraz poďme na čítanie do scanline pixel-by-pixel.
Opäť budeme sa obrátiť na náš trusty súbor I / O knižnice, a pozrieť sa na
fread funkcie.
fread sa na ukazovateľ na struct ktorý bude obsahovať bajtov, ktoré
čítate v, veľkosť každého prvok, ktorý čítate -
opäť, sizeof bude užitočný funkcia tu, počet
prvky veľkosti, veľkosti, že ste čítanie, a potom konečne,
inpointer, súbor, ktorý čítate z
Takže ste s číselnými prvkami veľkosti od inpointer, a
ich uvedenie do dát.
>> Teraz je čas na zmenu veľkosti vodorovne.
ak n sa rovná 2, potom pre každý pixel v Infil, budeme písať
dvakrát v outFile.
Ako píšeme súbory?
No, máme fwrite funkciu, tak sme vzali ukazovateľ na struct
ktorý obsahuje bajty, že ste písomné, a potom sme sa prejsť v
veľkosť, počet, a výstup, kde budete písať, že.
A potom opakovať proces, bude schopní jednoduché iteračné slučky for.
>> Ale musíme si uvedomiť, pridať výplň palcov
Koncept polstrovanie je, že dobre, Každý pixel je tri uhryznutie, ale
Veľkosť každého Scanline muštu byť násobkom 4 bajty.
Takže v prípade, že počet pixelov nie je násobkom 4, musíme pridať niektoré
polstrovanie, ktoré je len nuly.
Teraz, na rozdiel Kto to urobil, a na rozdiel od kópie, potom Infil obrazu a
outfile súboru sa líši majú rôzne vypchávky, pretože sú
rôzne šírky.
>> OK.
Tak snáď vzorec by hodiť sem.
Nechám to na vás, aby ste si to, ale ti, že písať polstrovanie,
dobre, je to len jednoduchá funkcia fputc, prechádzajúcej v charaktere
že chcete písať, a potom ukazovateľ súbor, ktorý ste
chcem písať.
Takže teraz, že sme zmene veľkosti horizontálne, a potom použiť padding,
nezabudnite, že budete musieť presunúť súbor ukazovateľ polohy, pretože vám
nemôže fread do polstrovanie.
Takže chcete, aby sa ubezpečil, že váš súbor ukazovateľ polohy v Infil
je v správnom mieste.
Pretože chceme tiež, aby Zmena veľkosti zvisle.
Nemôžeme len tak roztiahnuť vodorovne, pretože každý riadok potreby
ktorý má byť kopírovaný n-krát.
>> Teraz, tam je niekoľko rôznych spôsoby, ako to urobiť.
Takže jedna, môžeme použiť metódu prepísať, v pamätať, že všetky pixely
na daný riadok v poli, a potom napísať, že pole ako
toľkokrát, koľkokrát je potrebné.
Alebo je tu spôsob prekopírovať, kde po prečítaní jedného riadku v Infil
a potom napísal, že do outFile, pridanie polstrovanie, sme fseek
späť na začiatok pôvodného riadku, a potom opakujte horizontálne
veľkosti od tam.
Bez ohľadu na metódu, keď budete aby každý pixel sa bude opakovať
n krát, a každý riadok sa opakovať n krát, rovnako.
>> S tým budete mať bitmapu väčší ako život.
Volám sa Zamyla, a to je CS50.