next up previous
Next: Škriatkovia alebo "Obrázky s Up: grafika Previous: Omaľovánky alebo "Toto prosím

Obrázky alebo "Monu Lisu vľavo hore prosím."

Doteraz sme pracovali s jediným obrázkom -- s obrazovkou. Odvolávali sme sa na ňu s pomocou systémovej premennej screen. Táto premenná mala typ BITMAP* čiže smerník na bitmapu (bitmapa je len krycí názov pre obrázok). Dnes sa dozvieme, ako pracovať aj s inými obrázkami a ako obsah jedného dostať do druhého.

Sú dva druhy obrázkov. Tie, ktoré vidieť (obrazovka alebo jej časti) a tie, ktoré nevidieť. Zdalo by sa, že obrázky, ktoré nevidieť sú naprosto zbytočné. Je to prekvapivé, ale takéto obrázky (zvané pamäťové bitmapy) sa používajú veľmi často. Prvý dôvod je ten, že práca s obrazovkou je pomalá a práca s pamäťou rýchla. Takže často využívaný trik je, že sa nejaké zložitejšie kreslenie vykoná v pamäti a keď je to hotové, tak sa to potom celé skopíruje na obrazovku. Ďalšie použitie je, keď treba nejaký obrázok natiahnuť zo súboru. Taký obrázok sa odloží do pamäťovej bitmapy a potom sa môže kopírovať na obrazovku.

Na prvú ukážku je nutné, aby ste mali vo svojom počítači súbor xicht.tga v ktorom je uložený obrázok s rozmermi 100x100 bodov. Do deklarácie pridajte riadok

   BITMAP* obrazok;
Hlavný kód bude obsahovať nasledujúce riadky:
1   obrazok = load_bitmap("xicht.tga",NULL);
2   blit(obrazok,screen, 0,0, 270,190, 100,100);
Prvý riadok obsahuje funkciu load_bitmap, ktorá má toho na starosti veľa. Musí prečítať súbor, ktorý sa jej povie (rozumie obrázkom typu BMP, LBM, PCX a TGA), vytvoriť pre neho miesto v pamäti, obrázok do toho miesta skopírovať a vrátiť adresu, kde sa nachádza. Táto adresa sa potom vloží do premennej obrazok. Funkcia má dva parametre. Prvý je reťazec s menom súboru, druhý sa používa iba pri 8bitovej grafike (vtedy je to smerník na paletu, ktorá sa má použiť), inak má hodnotu NULL.

V druhom riadku je použitá funkcia blit, ktorá vie kopírovať kus jedného obrázka do druhého. Prvý parameter je obrázok, z ktorého sa kopíruje, druhý je obrázok do ktorého sa kopíruje. Ďalšie dve čísla označujú súradnice bodu v zdrojovom obrázku, z ktorého kopírovanie začne. (Ak chceme kopírovať celý obrázok, musí to byť vždy [0,0].) Ďalšie dve čísla označujú miesto v cieľovom obrázku, kam chceme kopírovať. V určenom bode bude ľavý horný roh nášho veľdiela. Posledná dvojica čísel určuje šírku a výšku toho, čo sa bude kopírovať. (Ak chceme skopírovať celý obrázok s rozmermi 100x100 bodov, musí tam byť [100,100].)

Program by bol skompilovateľný a spustiteľný. Ale akonáhle vytvoríme pamäťovú bitmapu, preberáme za ňu zodpovednosť. To znamená, že keď ju už nebudeme potrebovať, musíme ju z pamäte vymazať. Preto tesne pred skončením (až po záverečnom readkey) musíme zavolať funkciu destroy_bitmap. preform destroy_bitmap(obrazok);

Úloha č.1 Upravte uvedený program tak, aby sa kópia obrázku xicht.tga objavila v každom rohu obrazovky. Upravte ho tak, aby ste z obrázku skopírovali do stredu obrazovky len jeho ľavú hornú a pravú dolnú štvrtinu.

Obrázok je možné nielen kopírovať, ale aj naťahovať. Slúži na to funkcia stretch_blit. Nahraďte v predošlej ukážke druhý riadok nasledovným:

   stretch_blit(obrazok,screen, 0,0,100,100, 170,190,300,100);
Parametre sú podobné ako pri funkcii blit. Najprv treba uviesť odkiaľ a kam sa kopíruje. Potom sa označí bod, od ktorého sa začne v zdrojovom obrázku a šírka a výška plochy, ktorá sa bude kopírovať (v našom prípade bod [0,0], šírka aj výška 100). Potom sa určí bod šírka a výška v cieľovom obrázku. (Cieľová šírka je v našom prípade 300 a celý obrázok sa teda trikrát natiahne do šírky.)



Úloha č.2 Natiahnite obrázok xicht.tga na celú plochu obrazovky.

Úloha č.3 Vydláždite obrázkom xicht.tga obrazovku.

Úloha č.4 Nakreslite tisíckrát náhodne umiestnený a natiahnutý obrázok xicht.tga.


next up previous
Next: Škriatkovia alebo "Obrázky s Up: grafika Previous: Omaľovánky alebo "Toto prosím
Anino Belan
anino(at)smnd.sk