AspGerman Wiki

Im Browser verwendet man die hexadezimale Notation, um Farbwerte darzustellen. Die Hintergrundfarbe Weiß eines Dokuments wird wie folgt eingestellt:

<BODY BGCOLOR="#ffffff">

Das ganze besteht aus je einem Byte (0 bis 255) Rot, Grün und Blau (RGB), dargestellt in hexdezimal. Da sich Menschen im dezimalen System leichter tun, wäre es natürlich fein, eine Umwandlungsfunktion zu haben, die Dezimalfarbwerte in Hexadezimal umwandeln kann.

Die einfachste Idee wäre folgende:

Function rgb(r,g,b)
	rgb = hex(r) & hex(g) & hex(b)
End Function

Funktioniert auch, allerdings hat die Sache einen Schönheitsfehler: wird eine hex Zahl generiert die nur eine Stelle hat, dann fehlt die führende Null (leading zero). Bei Schwarz wäre 000000 richtig, allerdings die momentane Implementierung würde 000 liefern. Damit kann kein Browser etwas anfangen.

Also zurück zur Planung - wir brauchen immer eine führende Null. Man könnte ja folgendes machen:

Function rgb2(r,g,b)
	rr = hex(r)
	if (len(rr) = 1) then rr = "0" & rr
	rg = hex(g)
	if (len(rg) = 1) then rg = "0" & rg
	rb = hex(b)
	if (len(rb) = 1) then rb = "0" & rb
	rgb2 = rr & rg & rb
End Function

Das funktioniert so wie es soll. Aber ist es auch die schnellste Variante? Nein. Bei Geschwindigkeitsmessungen habe ich gefunden, daß folgende Implementierung zwar marginal, aber doch schneller ist:

Function rgb(r,g,b)
	rr = hex(r)
	rr = Right("0" & rr, 2)
	rg = hex(g)
	rg = Right("0" & rg, 2)
	rb = hex(b)
	rb = Right("0" & rb, 2)
	rgb = rr & rg & rb
End Function

Hier wird einfach eine 0 vorne angehängt, und dann auf 2 Stellen verkürzt. Liest sich auch einfacher. Und das Problem ist gelöst.

Nochmal ein paar hunderstel Sekunden liesen sich rauskitzeln, wenn ich die Zwischenzuweisungen wegnehme.

Function rgb(r,g,b)
	rr = Right("0" & hex(r), 2)
	rg = Right("0" & hex(g), 2)
	rb = Right("0" & hex(b), 2)
	rgb = rr & rg & rb
End Function

Oder ganz extrem ohne jegliche Zuweisung, aber kaum mehr lesbar ;)

Function rgb(r,g,b)
	rgb = Right("0" & hex(r), 2) & Right("0" & hex(g), 2) & Right("0" & hex(b), 2)
End Function

ScrewTurn Wiki version 2.0.33. Some of the icons created by FamFamFam.