Ik ben bezig geweest met wat code om RGB waarden om te zetten in HSL (hue, saturation, lumination). Ik denk dat dit redelijk gelukt is voor de saturation en lumination, alleen werkt het voor de hue totaal niet.
Om het een beetje te verduidelijken:

Het plaatje linksboven is het origineel. De rode is de hue, blauw de saturation en groen de illumination. Zoals je ziet, klopt er van de hue niets. Wat er niet klopt is dat er zijn maar een stuk of 4 waardes te zien in het plaatje, terwijl het een 8 bit getal hoort te zijn. En de kleurovergangen zijn zeker niet zo drastisch als op het plaatje op een egaal oppervlak (zie de muur rondom de poster). Ook is de muur eerder groen dan rood, waar dus zeker geen hue van rond de 255 hoort te zijn...
De code:
Ik heb deze code geschreven met behulp van deze site http://www.easyrgb.com/math.php?MATH=M18#text18. Als ik de code geport heb naar een functie in ActionScript, werkt het wel prima...
Om het een beetje te verduidelijken:
Het plaatje linksboven is het origineel. De rode is de hue, blauw de saturation en groen de illumination. Zoals je ziet, klopt er van de hue niets. Wat er niet klopt is dat er zijn maar een stuk of 4 waardes te zien in het plaatje, terwijl het een 8 bit getal hoort te zijn. En de kleurovergangen zijn zeker niet zo drastisch als op het plaatje op een egaal oppervlak (zie de muur rondom de poster). Ook is de muur eerder groen dan rood, waar dus zeker geen hue van rond de 255 hoort te zijn...
De code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| PixelData RGBtoHLS(PixelData colour) { float hue = 0; float sat = 0; float R = (float)colour.red / (float)255; float G = (float)colour.green / (float)255; float B = (float)colour.blue / (float)255; float min = Math.Min(R, Math.Min(G, B)); float max = Math.Max(R, Math.Max(G, B)); float delta = max - min; float lum = (max + min) / 2; //Trace.WriteLine(lum); if (delta == 0) { hue = 0; sat = 0; } else { if (lum < 0.5) { sat = delta / (max + min); } else { sat = delta / (2 - max - min); } float deltaR = (((max - R) / 6) + (delta / 2)) / delta; float deltaG = (((max - G) / 6) + (delta / 2)) / delta; float deltaB = (((max - B) / 6) + (delta / 2)) / delta; if (R == max) { hue = deltaB - deltaG; } else if (G == max) { hue = (1 / 3) + deltaR - deltaB; } else if (B == max) { hue = (2 / 3) + deltaG - deltaR; } if (hue < 0) { hue += 1; } else if (hue > 1) { hue -= 1; } } PixelData hls; // De rode channel krijgt de hue informatie mee, groene de lumination en blauw de saturation. hls.red = (byte)Math.Round(hue * 255); hls.green = (byte)Math.Round(lum * 255); hls.blue = (byte)Math.Round(sat * 255); return hls; } |
Ik heb deze code geschreven met behulp van deze site http://www.easyrgb.com/math.php?MATH=M18#text18. Als ik de code geport heb naar een functie in ActionScript, werkt het wel prima...
[ Voor 5% gewijzigd door microchip op 02-03-2006 23:56 ]