Thuis
Contacten

    Hoofdpagina


Programmeren in C++ voor beginners

Dovnload 5.04 Mb.

Programmeren in C++ voor beginners



Pagina28/49
Datum25.10.2017
Grootte5.04 Mb.

Dovnload 5.04 Mb.
1   ...   24   25   26   27   28   29   30   31   ...   49

Pixel manipulatie

Een pixel is een puntje op het beeldscherm van een bepaalde kleur. De kleur van een pixel bestaat uit drie kleine lampjes met de kleuren rood, groen en blauw. Een lampje heeft een waarde van 0 tot 256, waarbij 0 betekent dat 'ie uit staat en 255 dat 'ie vol aan staat. Door combinaties met deze drie lampjes te maken kun je alle kleuren maken. Elke kleur heeft een rood,groen,blauw waarde, of korter: een RGB waarde.




Kleur

Rood

Groen

Blauw

Zwart




0

0

0

Rood




255

0

0

Groen




0

255

0

Blauw




0

0

255

Geel




255

255

0

Paars




255

0

255

Aqua




0

255

255

Grijs




127

127

127

Wit




255

255

255

De kleur van een pixel lezen of te wijzigen is in de CLX relatief moeilijk.


Daarom geef ik hier twee functies die gemakkelijk te gebruiken zijn, maar waarvan de preciese werking nog even onduidelijk zal blijven.
De functie GetPixel haalt door middel van referencing los de RGB waarden op:
void GetPixel(

const TImage * const image,

const int x,

const int y,

unsigned char& red,

unsigned char& green,

unsigned char& blue)

{

assert(image!=0 && "Image is NULL");



assert(image->Picture->Bitmap!=0 && "Bitmap is NULL");

assert(image->Picture->Bitmap->PixelFormat == pf32bit

&& "Bitmap must be 32 bit");

assert( x >= 0 && "x coordinat is below zero");

assert( y >= 0 && "y coordinat is below zero");

assert( x < image->Picture->Bitmap->Width

&& "x coordinat is beyond image width");

assert( y < image->Picture->Bitmap->Height

&& "y coordinat is beyond image height");

red = (static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+2]);

green = (static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+1]);

blue = (static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+0]);

}
void SetPixel(

TImage * const image,

const int x,

const int y,

const char red,

const char green,

const char blue)

{

assert(image!=0 && "Image is NULL");



assert(image->Picture->Bitmap!=0 && "Bitmap is NULL");

assert(image->Picture->Bitmap->PixelFormat == pf32bit

&& "Bitmap must be 32 bit");

assert( x >= 0 && "x coordinat is below zero");

assert( y >= 0 && "y coordinat is below zero");

assert( x < image->Picture->Bitmap->Width

&& "x coordinat is beyond image width");

assert( y < image->Picture->Bitmap->Height

&& "y coordinat is beyond image height");
static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+2] = red;



static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+1] = green;



static_cast<unsigned char*>(

image->Picture->Bitmap->ScanLine[y])[x*4+0] = blue;

}
Merk het volgende op:

* De functie leest/schrijft van/naar een TImage Component.

* De meeste regels code zijn assert statements. Deze functie geeft dus precies aan wat 'ie aankan, namelijk 32-bit bitmaps. Als een assert statement mislukt, komt er een duidelijke tekst op het scherm. Tekst wordt blijkbaar gezien als true.

* Er wordt een nieuw data type unsigned char gebruikt. Dit is een subset van het data type int, die als mogelijke waarden 0 tot 256 heeft.

* De TImage heeft de Property Picture, die zelf ook weer Properties heeft.

* Er wordt gebruik gemaakt van static_cast. Heel lelijk, dit komt omdat ScanLine hetzelfde gedrag vertoond als de Windowsfunctie ScanLine. Windowsfuncties (of nauwkeuriger: Win32 API functies) zijn vaak lelijk en hebben vaak casts nodig.



* ScanLine maakt gebruik van de index operator (de blokhaken) om eerst bij de y-coordinaat te komen, dan nog eens om bij de juiste x-coordinaat en kleur te komen.




De functie ScanLine geeft een void pointer terug. Dit is een pointer zonder data type. Als je code niet type-safe maakt, is dit veel flexibeler!






Prefereer nooit een void pointer te gebruiken.

Om aan alle voorwaarden voor bovenstaande functie te voldoen, is het volgende nodig:

* Plaats een TImage Component op het Form

* Zet de Picture Property op 24 of 32 bit bitmap. Gebruik een simpel tekenprogramma om zo'n bitmap te maken.


Een pixel te tekenen is nu simpel:
SetPixel(Image1,0,0,0,127,0); //Groene pixel op (0,0)

Image1->Refresh();


Refresh is nodig om de nieuwe bewerking(en) daadwerkelijk te laten zien. Het hele plaatje kan eerst worden getekend en vervolgens pas op het scherm worden getekend. Dit scheelt tijd. Roep Refresh pas aan als dit nodig is.

1   ...   24   25   26   27   28   29   30   31   ...   49

  • Kleur Rood Groen

  • Dovnload 5.04 Mb.