| 发表于:2007-05-27 17:41:56 楼主 |
如何把rgb颜色模式转换为hsv模式?谢谢。 这是我从vc的代码转换成的vb代码,是否正确? private function rgb_to_hsv(r as byte, g as byte, b as byte, h as byte, s as byte, v as byte) dim max_v as byte, min_v as byte dim diff as single, r_dist as single, g_dist as single, b_dist as single dim hue as single dim undefined as byte undefined = 0 h = 0 s = 255 v = 255 max_v = max_rgb(r, g, b) min_v = min_rgb(r, g, b) diff = max_v - min_v v = max_v if max_v <> 0 then s = (255# * diff / max_v) else s = 0 end if if (s = 0) then h = undefined else r_dist = (max_v - r) / diff g_dist = (max_v - g) / diff b_dist = (max_v - b) / diff if (r = max_v) then hue = b_dist - g_dist elseif (g = max_v) then hue = 2 + r_dist - b_dist elseif (b = max_v) then hue = 4 + g_dist - r_dist end if if (hue < 0) then hue = hue + 6 end if h = (hue * (256# / 6#)) end if end function private function max_rgb(r as byte, g as byte, b as byte) as byte if r > g and r > b then max_rgb = r if g > r and g > b then max_rgb = g if b > r and b > g then max_rgb = b end function private function min_rgb(r as byte, g as byte, b as byte) as byte if r < g and r < b then min_rgb = r if g < r and g < b then min_rgb = g if b < r and b < g then min_rgb = b end function 源c语言如下: color::rgb_to_hsv(byte r, byte g, byte b, byte &h, byte &s, byte &v) { byte max_v, min_v; float diff, r_dist, g_dist, b_dist; float hue; byte undefined = 0; h = 0; s = 255; v = 255; max_v = max_rgb(r,g,b); min_v = min_rgb(r,g,b); diff = max_v - min_v; v = max_v; if( max_v != 0 ) { s = (byte)(255.0*diff/max_v); } else { s = 0; } if( s == 0 ) { h = undefined; } else { r_dist = (max_v - r)/diff; g_dist = (max_v - g)/diff; b_dist = (max_v - b)/diff; if( r == max_v ) { hue = b_dist - g_dist; } else if( g == max_v ) { hue = 2 + r_dist - b_dist; } else if( b == max_v ) { hue = 4 + g_dist - r_dist; } if(hue <0) { hue += 6.0; } h = (byte)(hue * (256.0/6.0)); } /***** float h=0,s=1.0,v=1.0; float max_v,min_v,diff,r_dist,g_dist,b_dist; float undefined = 0.0; max_v = maxrgb(r,g,b); min_v = minrgb(r,g,b); diff = max_v - min_v; v = max_v; if( max_v != 0 ) s = diff/max_v; else s = 0.0; if( s == 0 ) h = undefined; else { r_dist = (max_v - r)/diff; g_dist = (max_v - g)/diff; b_dist = (max_v - b)/diff; if( r == max_v ) h = b_dist - g_dist; else if( g == max_v ) h = 2 + r_dist - b_dist; else if( b == max_v ) h = 4 + g_dist - r_dist; else printf( "rgb2hsv::how did i get here?\n "); h *= 60; if( h < 0) h += 360.0; } |
|
|
|
|