ein Kapitel zurück                                           ein Kapitel weiter

Was bringt uns das beste Grafik-Modul wenn wir die einzelnen Elemente nicht mit der richtigen Farbe hervorheben können. Wie man Farbe alloziert haben sie im ersten Kapitel schon mal gesehen.........

white = gdImageColorAllocate(image,0,0,0);  //weiss

Hier allozieren wir die Weisse Farbe. Der Farbwert in den Klammern entspricht dabei den RGB-Farben (R,G,B) wie sie Ihn auch aus vielen Grafikprogrammen her kennen. Wobei die hellste Farbe Weis mit folgendem Wert belegt ist...

R=0, G=0, B=0

...und die dunkelste Farbe (schwarz) mit.......

R=255, G=255, B=255

Wobei mit den Rot-Grün-Blau-Werten theoretisch mehr wie 16 Millionen Farben darstellbar sind (255*255*255).

Damit sie nicht andauernd herumprobieren oder herumrechnen müssen, welche Farbe sie nun benötigen, können sie sich ja auf dieser Webseite umsehen............

http://gucky.uni-muenster.de/cgi-bin/rgbtab

Mittels....

white = gdImageColorDeallocate(image,0,0,0);

...geben sie die Farbe vom Index wieder frei. Auf diese Art und weise können mehrere Farben wieder freigegeben werden. Beispiel......

/*Download:gd3.c*/
#include <stdio.h> #include <gd.h> int main() { /*image initialisieren*/ gdImagePtr image; FILE *png; int black, white, red, green, grey; image = gdImageCreate(200,100); if(image==NULL) { /*Fehler*/ exit(0); } /*Speicher für die Farben allozieren*/ //white=gdImageColorAllocate(image,0,0,0); /*Weiss*/ black=gdImageColorAllocate(image,255,255,255); /*Schwarz*/ red =gdImageColorAllocate(image,255,0,0); /*rot*/ green =gdImageColorAllocate(image,0,255,0); /*blau*/ grey=gdImageColorAllocate(image,127,127,127); /*grau*/ gdImageRectangle(image,0,50,20,30,green); gdImageRectangle(image,20,50,40,40,green); gdImageRectangle(image,40,50,60,5,green); gdImageRectangle(image,60,50,80,70,red); gdImageRectangle(image,80,50,100,80,red); gdImageRectangle(image,100,50,120,90,red); gdImageRectangle(image,120,50,140,10,green); gdImageRectangle(image,140,50,160,20,green); gdImageRectangle(image,160,50,180,5,green); gdImageRectangle(image,180,50,199,70,red); gdImageLine(image,0,50,200,50,grey); png = fopen("bild3.png","wb"); gdImagePng(image,png); fclose(png); gdImageDestroy(image); return 0; }

Und so siehts aus :

Bild Numer 3


Zur Einstimmung was noch alles kommt haben wir hier eine Sinnlose Positiv/Negativ-Statistik. Ich habe diese jetzt mal nicht mit Farbe gefüllt da es für Rechtecke ein spezielles Füllwerkzeug gibt (Kommt noch). Nun kommt der Kunde und will die negative rote Farbe aus den Balken haben. Dies können sie nun mit einem einfachen.....

gdImageColorDeallocate(image,red);

...am Ende der Zeichnungen von Rechtecken setzen. Nun sind die Rechtecke anstatt rot, grau. Da der Mittelbalken ebenso grau ist. Die liegt am Flood Fill. Diese Methode füllt (Flood-Fill) Bereiche mit der angegebenen Farbe. Die Farbe breitet sich dabei beginnend bei Punkt (x,y) aus, bis sie durch ein Pixel in einer vom Ausgangs-Pixel verschiedenen Farbe gestoppt wird. Nun sieht das ganze folgendermaßen aus.........

Bild Nummer 4


Wollen sie eine Andersfärbung vermeiden, müssen sie die Mittellinie entfernen, oder sie setzen die Rechtecke immer einen Pixel über oder unter der Mittelline zum Start.

Weitere Methoden für die Farben habens sie mit.....

gdImageColorCloset

int apricot;
..........
apricot = gdImageColorClosest(image,255,200,180);
if(apricot < 0)
  fprintf(stderr, "Es wurden keine Farben alloziert\n");

Gibt den Index der Farbe zurück, deren Wert den übergebenen Rot-, Grün- und Blau-Komponenten am nächsten kommt. Wurden bislang keine Farben alloziert, wird -1 zurückgegeben.

gdImageColorExact

int rosey;
........
rosey = gdImageColorExact(image, 255,100,80);
if(rosey < 0)
 fprintf(stderr, "Farbe wurde nicht definiert\n");

Gibt den Index der Farbe zurück, deren Wert exakt den übergebenen Rot-, Grün- und Blau-Komponenten entspricht. Kommt eine solche Farbe in der Farbtabelle nicht vor, wird -1 zurückgegeben.

gdImageColorsTotal

maxColors = gdImageColorsTotal(image);
printf("Es wurde %d Farben im Image alloziert\n",maxColors);

colorsTotal gibt die Anzahl der mit colorAllocate allozierten Farben zurück.

gdImageGetPixel

int rgb,newcolor;
.......
rgb=gdImageGetPixel(image1,50,50);

newcolor=gdImageColorAllocate(image2,image1->

Mit getPixel bekommen sie den Farbwert zurück, dessen Punkt sie angeben. Diesen Farbwert können sie anschließend allozieren und Verwenden. Die Werte green,red und blue befinden sich in der Struktur......

typedef struct {
        unsigned char ** pixels;
        int sx;
        int sy;
        int colorsTotal;
        int red[gdMaxColors];
        int green[gdMaxColors];
        int blue[gdMaxColors];
        int open[gdMaxColors];
        int transparent;
} gdImage;

...gdImage die bei jedem neuen Image angelegt wird.

transparent

image->transparent;

Die Farbe die sie als Transparent angeben sind im Image unsichtbar. Geben sie -1 an wird Transparent ausgeschalten. Die Variable transparent befindet sich ebenfalls in der Struktur gdImage.

Zugegen diese Kaptitel war jetzt nur ein Schnelldurchlauf, aber in den nächsten Kapiteln gibt es wieder mehr Beispiele. Diese Farbfunktionen, finde ich, sprechen aber für sich und bedürfen eigentlich kaum Beispielen. Sie können diese ja in den Programmbeispielen am Anfang zum testen einbauen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf