18.4 Image_Color 

Besprochene Version: 1.0.1 | Lizenz: PHP-Lizenz 2.02 |
Klassendatei(en): Image/Color.php |
Die Arbeit mit Farben ist nicht immer einfach. Zwar ist der Farbraum, der durch das RGB-Modell beschrieben wird, nicht sehr kompliziert, aber wenn Sie eine Farbe vorgeben und deren Helligkeit ändern wollen, dann erfordert das schon ein wenig Mathematik oder Erfahrung im Umgang mit Farben.
Dieses und ähnliche Probleme löst das Paket Image_Color für Sie.
Ein Teil der Methoden kann statisch genutzt werden, was auch sinnvoll erscheint. Wenn Sie beispielsweise nur einen Farbwert konvertieren wollen, ist es nicht unbedingt notwendig, eine Objektinstanz abzuleiten.
Zum Ersten sind hier die Methoden rgb2hex() und hex2rgb() zu nennen, mit denen Sie eine RGB-Farbangabe in die hexadezimale Darstellung umwandeln können und umgekehrt. Die erste Methode bekommt ein Array übergeben, das aus drei Feldern besteht. Hierbei entspricht das erste Element dem Wert der Farbintensität für Rot, das zweite entspricht dem Grün-Anteil und das dritte dem Blau-Anteil. Jeder der Werte darf zwischen 0 und 255 liegen. Der Rückgabewert der Methode ist ein String mit der hexadezimalen Darstellung des Farbwertes.
require_once('Image/Color.php'); $rgb=array (255,255,0); echo Image_Color::rgb2hex($rgb); // Gibt FFFF00 aus
hex2rgb() stellt die Umkehrfunktion dazu dar. Sie bekommt einen String wie '#FA0FAE' oder 'FA0FAE' übergeben und liefert ein Array mit den Werten der drei Farbkanäle zurück.
Ähnliche Funktionen sind für das HSV- bzw. HSB-Farbmodell definiert. In diesem Farbmodell wird eine Farbe durch die Angaben für den Farbton (Hue), Sättigung (Saturation) und Helligkeit (Brightness, Value) definiert. Der Farbton wird hierbei als Winkel auf dem Farbkreis definiert (0° = Rot, 60° = Gelb, 120° = Grün, 180° = Cyan, 240° = Blau und 300° = Magenta). Die Sättigung und die Helligkeit werden jeweils in Prozent angegeben.
Da es aus Sicht eines Programmierers ein wenig ungewöhnlich ist, mit Farben im HSV-Modell zu arbeiten, sind nur Methoden vorgesehen, die von HSV nach RGB bzw. Hex konvertieren. hsv2rgb() und hsv2hex() bekommen beide die drei Werte einzeln als Parameter übergeben und konvertieren sie. Der Rückgabewert ist im ersten Fall ein Array und im zweiten ein String.
Eine weitere Konvertierungsfunktion ist color2RGB(), die eine Farbe in einer HTML-Angabe als Parameter akzeptiert und einen RGB-Wert als Array zurückgibt. Der Parameter dürfte also beispielsweise so
aufgebaut sein. Kann ein Wert nicht konvertiert werden, weil der Farbname nicht existiert oder das # bei einer hexadezimalen Angabe fehlt, gibt die Methode ein Array mit drei Nullen zurück. Wenn Sie wissen, dass die Farbe auf jeden Fall über ihren Namen definiert wird, können Sie auch die Methode namedColor2RGB() nutzen.
Die letzte Konvertierungsfunktion ist percentageColor2RGB(). Sie bekommt einen String mit drei Prozentzahlen übergeben, der z. B. so aussehen könnte: '70 %,30 %,80 %'. Dieser String wird anhand der Kommata aufgeteilt, und die einzelnen Prozentzahlen werden in die dezimalen Äquivalenzen umgerechnet und als Array zurückgegeben. Ein Wert größer als oder gleich 100 resultiert in der Zahl 255, wohingegen ein Wert kleiner gleich 0 als 0 zurückgegeben wird.
Da Farben oft bei der Verarbeitung von Bildern zum Einsatz kommen, sieht das Paket eine statische Methode vor, um einem Bild eine Farbe direkt zuweisen zu können. allocateColor() bekommt eine Referenz auf ein Bild und zusätzlich eine HTML-konforme Farbangabe übergeben.
require_once('Image/Color.php'); $img = imagecreate(400,400); $farbe = 'red'; // $farbe = '#FF0000'; Waere auch moeglich Image_Color::allocateColor($img, $farbe);
Eine weitere sehr interessante Member-Funktion ist getTextColor(). Sie nimmt sich der Frage an, ob eine Text-Farbe, die als erster Parameter übergeben wird, besser auf einem hellen oder einem dunklen Hintergrund zu lesen ist. Übergeben Sie nur die Text-Farbe, so liefert die Methode FFFFFF oder 000000 zurück, abhängig davon, auf welcher Farbe die Schrift besser zu lesen ist. Da ein rein weißer oder schwarzer Hintergrund nicht immer gewünscht ist, können Sie noch zwei weitere Farbwerte übergeben, von denen die Methode dann den zurückliefert, der besser harmoniert. Alle Parameter sind in diesem Fall hexadezimal kodiert zu übergeben.
Für alle folgenden Funktionen benötigen Sie jeweils ein Objekt der Klasse Image_Color. Ein Objekt dieser Klasse kann jeweils zwei Farbwerte verwalten. Um diese Farben an das Objekt zu übergeben, ist die Methode setColors() vorgesehen. setColors() erwartet zwei hexadezimale Farbwerte, die dann im Objekt abgelegt werden.
Die Methode changeLightness() gibt Ihnen die Möglichkeit, die Helligkeit der beiden enthaltenen Farben zu verändern. Intern werden die Farben, aufgeteilt in ihre Farbkanäle, dezimal abgespeichert. Wenn Sie der Methode einen positiven Wert übergeben, wird er auf alle Farbkanäle aufaddiert, und ein negativer Wert wird von allen subtrahiert. Da jeder Farbkanal einen Wert zwischen 0 und 255 haben darf, kann es durchaus zu Farbverfälschungen kommen, wenn einer der Kanäle den maximalen oder minimalen Wert erreicht hat und sich nur noch die anderen verändern. Diese Methode gibt noch keinen Wert zurück, was aber die beiden nächsten Funktionen machen. Bei der Nutzung von Farben im Internet stellt sich unter Umständen die Frage, ob diese zu den 216 websicheren Farben gehören. Wenn Sie die Methode setWebSafe() mit dem Parameter true aufrufen, sind alle zurückgegebenen Farben websicher. Andernfalls werden einfach die berechneten Werte genutzt, unabhängig davon, ob sie websicher sind oder nicht.
Um herauszufinden, welche Farben zwischen den beiden Farben liegen, die im Objekt abgespeichert sind, steht getRange() zur Verfügung. Übergeben Sie ihr keinen Parameter, liefert sie Ihnen ein Array mit zwei Farben zurück, die zwischen den beiden Farben liegen, die im Objekt gespeichert sind. Sie können allerdings auch eine Zahl übergeben, um zu spezifizieren, wie viele Zwischenschritte berechnet werden sollen. Dies kann z. B. eine sehr hilfreiche Methode sein, wenn Sie einen Schatten oder einen Farbverlauf generieren wollen.
mixColors(), die letzte definierte Methode, mischt die beiden Farben, die in dem Objekt enthalten sind, und gibt den berechneten Mischton als hexadezimalen Code zurück. Sie können dieser Methode auch direkt zwei hexadezimale Farbcodes übergeben. In diesem Fall würden diese Farbtöne gleichzeitig im Objekt abgelegt, so dass die Methode setColors() nicht genutzt werden muss.