IX. Diel C++ - Grafické plátno a jeho funkcie III.

Michal Kyžňanský  /  19. 10. 2005, 00:00

V tomto dieli si ukážeme posledné triky, ktoré nám ponúka grafické plátno. Ukážeme si, ako nahrávať obrázky a zmenšovať/zväčšovať ich. Vytvoríme si jednoduchý, ale zaujímavý filter na rozostrenie obrázkov.

Dnes si povieme o tom, ako nahrať obrázky do komponenty Image. Ukážeme si príklad, ako vytvoriť filter, ktorý nám obrázok jemne rozmaže pomocou nepresného kopírovania pixelov obrázka. K tomuto nám poslúži vnorený cyklus a príkazy Pixels. Predvedieme si aj zmenšovanie a zväčšovanie obrázka.

Vkladanie obrázka do komponenty Image je veľmi jednoduché. Vykonáva sa pomocou Object Inspectora, alebo vložením riadky kódu s cestou k obrázku. V Object Inspector-e je to voľba Picture. Syntax vkladania kódom je nasledovný:

 
Image1->Picture->LoadFromFile("C:\\obrázok.bmp");


Ďalšou dôležitou vecou, ktorú budeme potrebovať je vlastnosť Pixels. Obrázok budeme kopírovať z jednej grafickej plochy do druhej po jednotlivých pixeloch. Túto funkciu a aj filter, ktorý si vyrobíme je možné použiť iba, ak je obrázok vo formáte bmp. Vložíme si do formulára dve tlačidlá a dve komponenty Image rovnakej veľkosti vedľa seba. Kopírovanie pixelov sa bude vykonávať pomocou dvoch cyklov. Začneme od začiatku kopírovať prvý riadok obrázka a súradnicová os X sa bude zvyšovať. Súradnicová os Y však pri prvom riadku bude stála. A preto je dôležité, aby bol jeden z cyklov vnorený do druhého. Syntax kopírovania z jednej grafickej plochy do druhej je nasledovný.

 
void kopirovanie(void) {

TCanvas *f, *g;
f=Image1->Canvas;
g=Image2->Canvas;

int x, y;
for (y=0; yHeight; y++){ for (x=0; xWidth; x++){ g->Pixels[x][y]=f->Pixels[x][y]; } } }
Ak chceme obrázok zmenšiť/zväčšiť je nutné pridať znamienko * alebo /. Teda, či chceme zmenšiť či zväčšiť obsah pixelov.


Zmenšenie:

 
g->Pixels[x][y]=f->Pixels[x*2][y*2];
Zväčšenie:

 
g->Pixels[x][y]=f->Pixels[x/2][y/2];


Čerešničkou na torte je filter na rozmazanie, alebo na zrnenie obrazu. Je tiež založený na kopírovaní pixelov, ale ich umiestňovanie nie je presné. Umiestňovanie určuje generátor náhodných čísel v určitom rozsahu. Čím je tento rozsah vyšší, tým je obraz neostrejší.
Syntax pre generátor náhodných čísel je random(x), pričom x je číslo, ktoré udáva rozsah generovania náhodných čísel od nuly.

Rozostrenie:

 
g->Pixels[x][y]=f->Pixels[x+random(8)][y+random(8)];


Celý program bude vyzerať takto:

 
//-------------------------------------------------------------------
#include
#pragma hdrstop

#include "Unit1.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ Image1->Picture->LoadFromFile("C:\\joconde.bmp"); }
//--------------------------------------------------------------------
TCanvas *f, *g;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
f=Image1->Canvas; g=Image2->Canvas;
g->FillRect(Image2->ClientRect);
int x, y;
for (y=0; yHeight/2; y++){ for (x=0; xWidth/2; x++){ g->Pixels[x][y]=f->Pixels[x*2][y*2]; } } }
//--------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
f=Image1->Canvas;
g=Image2->Canvas;

int x, y;
for (y=0; yHeight; y++){
for (x=0; xWidth; x++){
g->Pixels[x][y]=f->Pixels[x+random(8)][y+random(8)];
}
}
}
//-------------------------------------------------------------------


Ukážka rozostrenia použitá na obrázku Mona Lisa:


Stiahnuť celý program.

V budúcom dieli začneme hovoriť o poliach a ich využití.

Súvisiace články:

Prehľad C++ dielov

Neprehliadnite: