Farbenspiele
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
Die dunkelste Farbe(schwarz - eher das fehlen von Licht) hat die grösstmöglichen Farbwerte:
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, auf der Sie eine Farbtabelle finden:
http://gucky.uni-muenster.de/cgi-bin/rgbtab
Um eine Farbe wieder vom Index freizugeben, nutzen Sie die Funktion:
white = gdImageColorDeallocate(image,0,0,0);
Auf diese Art und weise können mehrere Farben wieder freigegeben werden. Beispiel:
/* 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:
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 einer Zeile im Code erledigen:
gdImageColorDeallocate(image, red);
Wollen sie eine Andersfärbung vermeiden, müssen sie die Mittellinie entfernen, oder sie setzen die Rechtecke immer einen Pixel über oder unter der Mittellinie zum Start.
Weitere Methoden für Farben
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 gdImage, die bei jedem Neuen Image angelegt wird:
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;
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.
Zugegeben, 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.
Weiter mit Werkzeuge für Farben
