1 /** 2 This module defines RGB <-> HSV conversions. 3 */ 4 module gfm.image.hsv; 5 6 import std.algorithm, 7 std.math; 8 9 import gfm.math.vector; 10 11 // RGB <-> HSV conversions. 12 13 /// Converts a RGB triplet to HSV. 14 /// Authors: Sam Hocevar 15 /// See_also: $(WEB http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv) 16 deprecated("Use ae.utils.graphics.hls instead") 17 vec3f rgb2hsv(vec3f rgb) pure nothrow 18 { 19 float K = 0.0f; 20 21 if (rgb.y < rgb.z) 22 { 23 swap(rgb.y, rgb.z); 24 K = -1.0f; 25 } 26 27 if (rgb.x < rgb.y) 28 { 29 swap(rgb.x, rgb.y); 30 K = -2.0f / 6.0f - K; 31 } 32 33 float chroma = rgb.x - (rgb.y < rgb.z ? rgb.y : rgb.z); 34 float h = abs(K + (rgb.y - rgb.z) / (6.0f * chroma + 1e-20f)); 35 float s = chroma / (rgb.x + 1e-20f); 36 float v = rgb.x; 37 38 return vec3f(h, s, v); 39 } 40 41 /// Convert a HSV triplet to RGB. 42 /// Authors: Sam Hocevar. 43 /// See_also: $(WEB http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv). 44 deprecated("Use ae.utils.graphics.hls instead") 45 vec3f hsv2rgb(vec3f hsv) pure nothrow 46 { 47 float S = hsv.y; 48 float H = hsv.x; 49 float V = hsv.z; 50 51 vec3f rgb; 52 53 if ( S == 0.0 ) 54 { 55 rgb.x = V; 56 rgb.y = V; 57 rgb.z = V; 58 } 59 else 60 { 61 if (H >= 1.0) 62 { 63 H = 0.0; 64 } 65 else 66 { 67 H = H * 6; 68 } 69 int I = cast(int)H; 70 assert(I >= 0 && I < 6); 71 float F = H - I; /* fractional part */ 72 73 float M = V * (1 - S); 74 float N = V * (1 - S * F); 75 float K = V * (1 - S * (1 - F)); 76 77 if (I == 0) { rgb.x = V; rgb.y = K; rgb.z = M; } 78 if (I == 1) { rgb.x = N; rgb.y = V; rgb.z = M; } 79 if (I == 2) { rgb.x = M; rgb.y = V; rgb.z = K; } 80 if (I == 3) { rgb.x = M; rgb.y = N; rgb.z = V; } 81 if (I == 4) { rgb.x = K; rgb.y = M; rgb.z = V; } 82 if (I == 5) { rgb.x = V; rgb.y = M; rgb.z = N; } 83 } 84 return rgb; 85 }